Java在C#中的最终效果是什么?

Java在C#中的final是什么?

final关键字在Java中有几种用法。 它对应于C#中的sealed关键字和readonly关键字,具体取决于它使用的上下文。

防止inheritance(从定义的类inheritance):

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

正如Joachim Sauer指出的那样,这两种语言之间的明显区别在于,Java默认将所有非静态方法标记为virtual ,而C#则将它们标记为sealed 。 因此,如果您希望停止在基类中明确标记为virtual的方法的进一步覆盖,则只需在C#中使用sealed关键字。

variables

只允许一个variables分配一次:

Java的

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

C#

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

另外, readonly关键字的作用与const关键字的作用不同,因为readonlyexpression式是在运行 时而不是编译时计算的 ,因此允许任意expression式。

这取决于上下文。

  • 对于final类或方法, C#等价物是sealed
  • 对于final字段, C#等价物是readonly
  • 对于final局部variables或方法参数,没有直接的C#等价物。

这里的每个人都缺less的是Java对最终成员variables的明确赋值的保证。

对于具有最终成员variablesV的类C,通过C的每个构造函数的每个可能的执行path都必须分配V一次 – 无法分配V或分配V两次或更多次将导致错误。

C#的readonly关键字没有这样的保证 – 编译器非常乐意让readonly成员不被分配,或者允许你在一个构造函数中多次赋值。

所以,final和readonly(至less就成员variables而言)绝对不是等价的,final是更严格的。

Java类final和method final – >密封。 Java成员variablesfinal – > readonly为运行时常量,const为编译时常量。

没有等效的局部variablesfi​​nal和method argument final

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

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

如前所述, sealed对于方法和类来说是等价的。

至于其余,这是复杂的。

  • 在声明中定义的(静态)常量上, const可以被认为是等价的,只要它是一个基本types或一个不可变类。
  • 在离开构造函数时不应重新分配的字段中,只能使用readonly ,但它不相等 – 即使在构造函数中, final需要一个赋值。
  • 我猜应该只能分配一次局部variables,不能用C#创build。 如果你想知道为什么有人需要它:你可以在if-else, switch-case等之前声明一个variables。 通过声明它是最终的,你强制它被分配一次,如果没有,编译器错误发生。 这需要良好行为的代码,所以有更less的错误。

总结起来,C#没有直接相当于final 。 虽然Java缺乏C#的一些很好的function,但对于我来说,作为大多数Java程序员来说,看起来C#不能提供相当的function是令人耳目一新的。

密封

    Interesting Posts