关于访问修饰符:在C#中Java的最终结果是什么?

What is the equivalent of Java's final in C#?

在C语言中,Java的EDCOX1 0的等价物是什么?


EDCOX1的0个关键字在Java中有几种用法。它与c_中的sealedreadonly关键字都对应,这取决于使用它的上下文。

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

爪哇

1
public final class MyFinalClass {...}

C.*

1
public sealed class MyFinalClass {...}

方法

防止覆盖virtual方法。

爪哇

1
2
3
4
public class MyClass
{
    public final void myFinalMethod() {...}
}

C.*

1
2
3
4
public class MyClass : MyBaseClass
{
    public sealed override void MyFinalMethod() {...}
}

正如约阿希姆·绍尔指出的,这两种语言之间的一个显著差异是Java默认地将所有非静态方法标记为EDCOX1(3),而C则标记为EDCOX1(1)。因此,如果您希望停止对基类中已显式标记为virtual的方法的进一步重写,只需在C中使用sealed关键字。

变量

只允许变量分配一次:

爪哇

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

C.*

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

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


这取决于上下文。

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


这里每个人缺少的是Java对最终成员变量的明确分配的保证。

对于具有最终成员变量v的C类,通过C的每个构造函数的每个可能的执行路径都必须精确地分配v一次-未能分配v或分配v两次或两次以上将导致错误。

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

所以,final和readonly(至少在成员变量方面)绝对不是等价的——final要严格得多。


如前所述,对于方法和类,sealed相当于final

至于其他的,这是复杂的。

  • 在声明中定义的(静态)常量上,只要const是基元类型或不可变类,就可以将其视为等效的。
  • 在一个一旦离开构造函数就不应该重新分配的字段上,可以使用readonly,但它不等于final,即使在构造函数中,也只需要一个分配。
  • 我想,一个应该只分配一次的局部变量不能在C中创建。如果您想知道为什么会有人需要它:您可以先声明一个变量,然后再声明一些if-else,切换case等等。通过将其声明为final,可以强制它只分配一次,如果没有,则会发生编译器错误。这需要行为良好的代码,因此错误较少。

综上所述,c没有直接等价于final。虽然Java缺少一些很好的C语言特性,但对于我来说,大多数Java程序员都能看到C语言无法传递等效的内容。


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

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


http://en.csharp online.net/csharp_常见问题解答:_什么是 u csharp_和 u java_常量声明之间的差异

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


密封的