在C#中,Java的 final 相当于什么?
final
final关键字在Java中有几种用法 . 它对应于C#中的sealed和readonly关键字,具体取决于使用它的上下文 .
要防止子类化(从定义的类继承):
Java
public final class MyFinalClass {...}
C#
public sealed class MyFinalClass {...}
防止覆盖 virtual 方法 .
virtual
public class MyClass { public final void myFinalMethod() {...} }
public class MyClass : MyBaseClass { public sealed override void MyFinalMethod() {...} }
正如Joachim Sauer所指出的,这两种语言之间的显着差异是Java默认将所有非静态方法标记为 virtual ,而C#将它们标记为 sealed . 因此,如果要停止进一步覆盖已在基类中明确标记为 virtual 的方法,则只需在C#中使用 sealed 关键字 .
sealed
仅允许为变量分配一次:
public final double pi = 3.14; // essentially a constant
public readonly double pi = 3.14; // essentially a constant
作为旁注, readonly 关键字的效果与const关键字的效果不同,因为 readonly 表达式是在运行时而不是编译时计算的,因此允许任意表达式 .
readonly
这取决于具体情况 .
对于 final 类或方法,C# equivalent is sealed .
对于 final 字段,C# equivalent is readonly .
对于 final 局部变量或方法参数,没有直接的C#等价物 .
这里缺少的是Java对最终成员变量的明确赋值的保证 .
对于具有最终成员变量V的C类,通过C的每个构造函数的每个可能的执行路径必须恰好分配V一次 - 未能分配V或分配V两次或更多次将导致错误 .
C#的readonly关键字没有这样的保证 - 编译器非常乐意将readonly成员保留为未分配或允许您在构造函数中多次分配它们 .
所以,final和readonly(至少就成员变量而言)绝对不是等价的 - final更加严格 .
Java类final和方法final - > sealed . Java成员变量final - > readonly用于运行时常量,const用于编译时常量 .
没有等效的Local Variable final和method参数final
如上所述,对于方法和类, sealed 相当于 final .
至于其余的,它很复杂 .
在声明中定义的(静态)常量上, const 可以被认为是等价的,只要它是基本类型或不可变类 .
const
在一个离开构造函数后不应重新赋值的字段上,可以使用 readonly ,但它不相等 - 即使在构造函数中, final 也只需要一个赋值 .
我猜想,在C#中无法创建一个应该只分配一次的局部变量 . 如果你想知道为什么有人需要它:你可以在一些if-else之前声明一个变量,switch-case左右 . 通过将其声明为final,您强制执行一次,如果没有,则会发生编译器错误 . 这需要表现良好的代码,因此错误更少 .
总结起来,C#没有直接等同于 final . 虽然Java缺乏C#的一些不错的功能,但对于我来说,作为一个Java程序员来看,C#无法提供等价的东西让我感到耳目一新 .
http://en.csharp-online.net/CSharp_FAQ:_What_are_the_differences_between_CSharp_and_Java_constant_declarations
C#常量使用const关键字为编译时常量声明,或者使用readonly关键字为运行时常量声明 . 常量的语义在C#和Java语言中都是相同的 .
密封
7 回答
final关键字在Java中有几种用法 . 它对应于C#中的sealed和readonly关键字,具体取决于使用它的上下文 .
类
要防止子类化(从定义的类继承):
Java
C#
方法
防止覆盖
virtual
方法 .Java
C#
正如Joachim Sauer所指出的,这两种语言之间的显着差异是Java默认将所有非静态方法标记为
virtual
,而C#将它们标记为sealed
. 因此,如果要停止进一步覆盖已在基类中明确标记为virtual
的方法,则只需在C#中使用sealed
关键字 .变量
仅允许为变量分配一次:
Java
C#
作为旁注,
readonly
关键字的效果与const关键字的效果不同,因为readonly
表达式是在运行时而不是编译时计算的,因此允许任意表达式 .这取决于具体情况 .
对于
final
类或方法,C# equivalent is sealed .对于
final
字段,C# equivalent is readonly .对于
final
局部变量或方法参数,没有直接的C#等价物 .这里缺少的是Java对最终成员变量的明确赋值的保证 .
对于具有最终成员变量V的C类,通过C的每个构造函数的每个可能的执行路径必须恰好分配V一次 - 未能分配V或分配V两次或更多次将导致错误 .
C#的readonly关键字没有这样的保证 - 编译器非常乐意将readonly成员保留为未分配或允许您在构造函数中多次分配它们 .
所以,final和readonly(至少就成员变量而言)绝对不是等价的 - final更加严格 .
Java类final和方法final - > sealed . Java成员变量final - > readonly用于运行时常量,const用于编译时常量 .
没有等效的Local Variable final和method参数final
如上所述,对于方法和类,
sealed
相当于final
.至于其余的,它很复杂 .
在声明中定义的(静态)常量上,
const
可以被认为是等价的,只要它是基本类型或不可变类 .在一个离开构造函数后不应重新赋值的字段上,可以使用
readonly
,但它不相等 - 即使在构造函数中,final
也只需要一个赋值 .我猜想,在C#中无法创建一个应该只分配一次的局部变量 . 如果你想知道为什么有人需要它:你可以在一些if-else之前声明一个变量,switch-case左右 . 通过将其声明为final,您强制执行一次,如果没有,则会发生编译器错误 . 这需要表现良好的代码,因此错误更少 .
总结起来,C#没有直接等同于
final
. 虽然Java缺乏C#的一些不错的功能,但对于我来说,作为一个Java程序员来看,C#无法提供等价的东西让我感到耳目一新 .http://en.csharp-online.net/CSharp_FAQ:_What_are_the_differences_between_CSharp_and_Java_constant_declarations
C#常量使用const关键字为编译时常量声明,或者使用readonly关键字为运行时常量声明 . 常量的语义在C#和Java语言中都是相同的 .
密封