在C#中,与Java的final
相当的关键字是readonly
。
在C#中,与Java的final
相当的关键字是readonly
。
final
关键字在Java中有几个用途。根据使用的上下文,它对应于C#中的sealed
和readonly
关键字。
为了防止子类化(从定义的类继承):
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() {...}
}
virtual
,而C#将它们标记为sealed
。因此,如果您想要停止进一步覆盖在基类中已明确标记为virtual
的方法,只需在C#中使用sealed
关键字即可。
只允许变量被赋值一次:
Java
public final double pi = 3.14; // essentially a constant
C#
public readonly double pi = 3.14; // essentially a constant
readonly
关键字的效果与 const
关键字不同,因为 readonly
表达式是在运行时而不是编译时进行评估,因此允许任意表达式。readonly
成员变量是可以被修改的:http://pastebin.com/AzqzYGiA - recursive这取决于上下文。
final
类或方法,C#的等效语句是sealed
。final
字段,C#的等效语句是readonly
。final
局部变量或方法参数,没有直接的C#等效语句。const
只能用于值类型。据我所知,无法对本地引用类型创建有效的常量。 - jocull在这里所有人都忽略了Java对于final成员变量明确赋值的保证。
对于一个带有final成员变量V的类C,通过C的每一种可能的构造函数的每一个执行路径都必须恰好赋值给V一次——未赋值V或者在构造函数中赋值给V两次及以上会导致错误。
C#的readonly关键字没有这样的保证——编译器很愿意让readonly成员未被赋值或允许你在一个构造函数中多次为其赋值。
因此,final和readonly(至少在成员变量方面)绝对不是等价的——final更加严格。
sealed
是方法和类的final
等效语句。static final
字段,static readonly
是最接近的替代方案。它允许您在静态构造函数中初始化静态字段,这与Java中的静态初始化器非常相似。这适用于常量(基元和不可变对象)以及对可变对象的常量引用。
const
修饰符对于常量来说非常相似,但您不能在静态构造函数中设置它们。readonly
。虽然它不等同于final
——final
要求在构造函数或初始化程序中仅有一个赋值。final
本地变量的等效项。如果你想知道为什么会需要它:你可以在if-else、switch-case之前声明一个变量。通过将它声明为final,您强制它最多被赋值一次。final
的功能。虽然 Java 缺少一些 C# 的好用特性,但作为一个主要使用 Java 的程序员,看到 C# 无法提供相应的功能还是让我感到振奋。null
的初始化,添加了final
关键字。如果编译通过,那么我就使它更清晰了。如果不能通过编译,那么我就学到了有关它被重新赋值的有用信息。然后,我可以提出更难的问题,比如:这是否是预期的行为?如果是,我如何澄清这一点呢? - VlasecJava类中的final关键字和方法中的final关键字 -> 被称为sealed。 Java成员变量中的final关键字 -> 运行时常量使用readonly,编译时常量使用const。
局部变量的final关键字和方法参数的final关键字没有等效的关键字。
C#中的常量使用const关键字声明编译时常量或readonly关键字声明运行时常量。在C#和Java语言中,常量的语义是相同的。
密封的