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

问题描述 投票:527回答:7

在C#中,Java的final相当于什么?

c# access-modifiers reserved-words
7个回答
820
投票

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

要防止子类化(从定义的类继承):

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。因此,如果要停止进一步覆盖已在基类中明确标记为sealed的方法,则只需在C#中使用virtual关键字。

变量

仅允许为变量分配一次:

Java的

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

C#

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

作为旁注,readonly关键字的效果与const关键字的效果不同,因为readonly表达式是在运行时而不是编译时计算的,因此允许任意表达式。


167
投票

这取决于具体情况。


41
投票

这里缺少的是Java对最终成员变量的明确赋值的保证。

对于具有最终成员变量V的C类,通过C的每个构造函数的每个可能的执行路径必须恰好分配V一次 - 未能分配V或分配V两次或更多次将导致错误。

C#的readonly关键字没有这样的保证 - 编译器非常乐意将readonly成员保留为未分配或允许您在构造函数中多次分配它们。

所以,final和readonly(至少就成员变量而言)绝对不是等价的 - final更加严格。


6
投票

Java类final和方法final - > sealed。 Java成员变量final - > readonly用于运行时常量,const用于编译时常量。

没有等效的Local Variable final和method参数final


6
投票

如上所述,sealed相当于final的方法和类。

至于其余的,它很复杂。

  • 在声明中定义的(静态)常量上,const可以被认为是等价的,只要它是原始类型或不可变类。
  • 在一个离开构造函数时不应重新赋值的字​​段上,可以使用readonly,但它不相等 - 即使在构造函数中,final也只需要一个赋值。
  • 我想,无法在C#中创建一个应该只分配一次的局部变量。如果你想知道为什么有人需要它:你可以在一些if-else,switch-case之前声明一个变量。通过将其声明为final,您强制执行一次,如果没有,则会发生编译器错误。这需要表现良好的代码,因此错误更少。

总而言之,C#没有直接相当于final。虽然Java缺乏C#的一些不错的功能,但对于我来说,作为一个Java程序员来看,C#无法提供等价的东西让我感到耳目一新。


5
投票

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

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


0
投票

密封

© www.soinside.com 2019 - 2024. All rights reserved.