Answers:
该final
关键字在Java中的几个用途。它取决于C#中的sealed
和readonly
关键字,具体取决于使用它的上下文。
为了防止子类化(继承自定义的类):
爪哇
public final class MyFinalClass {...}
C#
public sealed class MyFinalClass {...}
防止重写virtual
方法。
爪哇
public class MyClass
{
public final void myFinalMethod() {...}
}
C#
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
正如Joachim Sauer所指出的,这两种语言之间的显着区别是Java默认将所有非静态方法都标记为virtual
,而C#将它们标记为sealed
。因此,仅sealed
当您想停止进一步重写已virtual
在基类中显式标记的方法时,才需要在C#中使用关键字。
仅允许一次分配变量:
爪哇
public final double pi = 3.14; // essentially a constant
C#
public readonly double pi = 3.14; // essentially a constant
作为边注,所述的效果readonly
关键词不同于所述的const
,所述关键字readonly
表达在评价运行时,而不是编译时,因此允许任意表达式。
readonly
可以在构造函数中修改成员变量:pastebin.com/AzqzYGiA
这取决于上下文。
final
类或方法,等效sealed
于C#。final
字段,C#等效为readonly
。final
局部变量或方法参数,没有直接的C#等效项。For a final local variable or method parameter, there's no direct C# equivalent
有很大的区别。
const
只能用于值类型。据我所知,没有办法为本地引用类型设置有效常数。
如前所述,sealed
等效于final
for方法和类。
至于其他,则很复杂。
对于static final
字段,static readonly
是最接近的事情。它允许您在静态构造函数中初始化静态字段,这与Java中的静态初始化程序非常相似。这既适用于常量(原始对象和不可变对象),也适用于对可变对象的常量引用。
该const
修正是常数非常相似,但你不能将它们放置在静态构造函数。
readonly
可以使用。但是,它并不相等- final
甚至在构造函数或初始化程序中也只需要一个赋值。final
我所知道的局部变量没有C#等效项。如果您想知道为什么有人会需要它:您可以在if-else,switch-case左右之前声明一个变量。通过最终声明,您可以强制对其最多分配一次。
通常,Java局部变量在读取前至少需要分配一次。除非分支在读取值之前跳出,否则最终变量将只分配一次。所有这些都在编译时检查。这需要行为良好的代码,且错误容限较小。
总结起来,C#没有与的直接等效final
。尽管Java缺少C#的某些出色功能,但对于大多数Java程序员来说,看到C#无法提供等效的东西对我来说是令人耳目一新的。
C#常量使用const关键字声明编译时常量,或者使用readonly关键字声明运行时常量。在C#和Java语言中,常量的语义相同。