什么是Java的相当于final
在C#中?
Answer 1:
在final
关键字在Java中的几个用途。 它对应于两个sealed
和readonly
关键字在C#,取决于在其中使用它的上下文。
类
为了防止子类(从定义的类继承):
Java的
public final class MyFinalClass {...}
C#
public sealed class MyFinalClass {...}
方法
防止一个的首要virtual
方法。
Java的
public class MyClass
{
public final void myFinalMethod() {...}
}
C#
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
正如约阿希姆·绍尔指出,在两种语言之间有明显的差异这里是Java在默认情况下标记所有非静态方法virtual
的,而C#将其标记为sealed
。 因此,你只需要使用sealed
,如果你想停止已明确标记的方法的进一步压倒一切的关键词在C#中virtual
基类。
变量
只允许一个变量来分配一次:
Java的
public final double pi = 3.14; // essentially a constant
C#
public readonly double pi = 3.14; // essentially a constant
作为边注,所述的效果readonly
关键字从所述的不同const
关键字,所述readonly
表达是在运行时评估,而不是编译时 ,因此允许任意表达式。
Answer 2:
这取决于上下文。
- 对于
final
类或方法,所述C#当量sealed
。 - 对于
final
领域, C#当量为readonly
。 - 对于
final
局部变量或方法参数,也没有直接的C#等价的。
Answer 3:
每个人都在这里缺少的是最终成员变量明确赋值的Java的保证。
对于C类与最终成员变量V,至C的每一个构造每一个可能的执行路径必须分配V恰好一次 - 未能分配V或分配伏两或更多次将导致一个错误。
C#的只读关键字没有这样的保证 - 编译器是乐意离开只读成员未分配或让你给他们多次构造方法中分配更多。
因此,最后和只读(至少相对于成员变量)是绝对不等同 - 最终是要严格得多。
Answer 4:
Java类最终和方法决赛 - >密封。 Java成员变量最终 - >只读运行时恒定,常量为编译时间常数。
没有类似的局部变量最终和方法论证最终
Answer 5:
如所提到的, sealed
是的等效final
的方法和类。
至于其他的,它是复杂的。
- 在声明中定义一个(静态)恒定,
const
可以被认为是等价物,条件是其是原始类型或不可变的类。 - 在不应该被重新分配,一旦它离开构造一个字段,
readonly
可以使用,但不等于-final
要求,即使在构造函数中只有一个任务。 - 是应该被分配一次也不会在C#中创建一个局部变量,我想。 如果你想知道为什么会有人需要它:你可以在一定的if-else,事先声明一个变量的switch-case左右。 通过声明它作为最终,你强制自己被分配只有一次,如果没有,编译器错误发生。 这需要很乖的代码,所以有错误更少。
概括起来,C#具有不直接等同final
。 而Java缺少C#的一些不错的功能,令人耳目一新对我来说主要是一个Java程序员,看看C#未能提供等效的。
Answer 6:
http://en.csharp-online.net/CSharp_FAQ:_What_are_the_differences_between_CSharp_and_Java_constant_declarations
C#常量使用编译时间常数const关键字或运行时常只读关键字声明。 常量的语义是在C#和Java语言都相同。
Answer 7:
密封