CSharp - Java final 在c#中的等价是什么?

Java final在C#中的等价是什么?

时间:

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() {...}
}

这两种语言之间的显著区别是Java默认将所有非静态方法标记为virtual。

变量

只允许分配一个变量一次:

Java


public final double pi = 3.14; // essentially a constant

C#


public readonly double pi = 3.14; // essentially a constant

这取决于上下文。

这里的每个人都丢失了 final 成员变量的明确赋值的java保证。

final c类成员变量v,所有可能的执行路径通过的每一个构造函数c必须完全分配vV - v未能分配或分配两次以上将导致一个错误。

只读的C# 关键字没有这样的保证- 编译器很乐意将只读成员保留为只读,或者允许你在构造函数中多次分配它们。

因此,final 和 readonly ( 至少关于成员变量) 绝对不一样- final 更严格。

Java类 final 和方法 final -> 密封。 Java成员变量 final -> 只读为运行时常量,编译时常量常数。

局部变量 final 和方法参数 final 没有等效项

http://en.csharp-online.net/CSharp_FAQ:_What_are_the_differences_between_CSharp_and_Java_constant_declarations

使用编译时常量的const关键字或者运行时常量的readonly关键字声明 C# 常量。 C# 和Java语言中常量的语义相同。

密封

如上所述,sealed 是方法和类的等价 final

至于其他的,它很复杂。

  • ( 静态) 常数声明中定义, const 可以被认为是一个等价的,只要它是一个原始类型或一个不可变类。
  • 领域,不应重新分配一旦离开了构造函数, readonly 可以被使用,但它不是平等—— final 需要一个任务即使在构造函数。
  • 不能在 C# 中创建一个只被分配一次的局部变量,我认为。 如果你想知道为什么会有人需要它: 你可以在某些 if-else,switch-case 或者so之前声明一个变量。 如果将它声明为 final,则强制它只分配一次,如果不是,编译器错误发生。 这需要良好行为的代码,因此有较少的错误。

总结起来,C# 没有直接等价的final 。 尽管java C# 缺乏一些不错的特性,是清新的我主要是一个java程序员看到 C# 未能提供一个等价的。

sealed和readonly不能用于变量,对于变量,使用const关键字等效效果。

...