Nol*_*rin 837

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

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

Java的

public final class MyFinalClass {...}
Run Code Online (Sandbox Code Playgroud)

C#

public sealed class MyFinalClass {...}
Run Code Online (Sandbox Code Playgroud)

方法

防止覆盖virtual方法.

Java的

public class MyClass
{
    public final void myFinalMethod() {...}
}
Run Code Online (Sandbox Code Playgroud)

C#

public class MyClass : MyBaseClass
{
    public sealed override void MyFinalMethod() {...}
}
Run Code Online (Sandbox Code Playgroud)

正如Joachim Sauer所指出的,这两种语言之间的显着差异是Java默认将所有非静态方法virtual标记为,而C#标记为sealed.因此,sealed如果要停止进一步覆盖已virtual在基类中明确标记的方法,则只需在C#中使用关键字.

变量

仅允许为变量分配一次:

Java的

public final double pi = 3.14; // essentially a constant
Run Code Online (Sandbox Code Playgroud)

C#

public readonly double pi = 3.14; // essentially a constant
Run Code Online (Sandbox Code Playgroud)

作为边注,所述的效果readonly关键词不同于所述的const在该关键字的readonly表达在评价运行时而非在编译时间,因此允许任意表达式.

  • 很好的答案 - 在java中还有一个"final"的用法 - 在局部变量或方法参数上,以防止重新分配它.没有c#direct相当于此. (163认同)
  • `readonly`成员变量*可以在构造函数中修改:http://pastebin.com/AzqzYGiA (17认同)
  • 我要补充一点,默认情况下,Java中的所有非静态方法都是虚拟的.所以在C#中你可以简单地在初始定义中省略虚拟,你需要使用"final"来避免子类在Java中覆盖它 (14认同)
  • 另请注意:如果在Java中将成员变量声明为final,则编译器会抱怨,如果不是每个构造函数都在每个代码路径中分配一个值,而C#仅在该场景中使用只读成员变量发出警告 (8认同)

Luk*_*keH 171

这取决于具体情况.

  • +对于`对于最终的局部变量或方法参数,没有直接的C#等价物是一个巨大的区别. (24认同)
  • 如果您要_实例化_,则可以使用局部变量的 **const**。它是不等价的,因为当然 **final** 允许您单独声明和初始化(因此具有不同的值),但以防万一您不知道...... (3认同)
  • `const` 只能用于值类型。据我所知,没有办法为本地引用类型创建一个有效的常量。 (3认同)
  • @jocull 字符串是唯一的例外。 (2认同)
  • java 是我在 C# 中怀念的少数几个地方之一。局部变量的final以确保它不会改变。“最终 int someCount = someLinqEnumerable.Count();” 将不胜感激。(我显示我正在使用一种方法来水合该值,因此不能使用 const int someCount” (2认同)

小智 42

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

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

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

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


Vla*_*sec 7

如上所述,sealedfinal方法和类的等价物.

至于其余的,它很复杂.

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

总结一下,C#没有直接的等价物readonly.虽然Java缺乏C#的一些不错的功能,但对于我来说,作为一个Java程序员来看,C#无法提供等价的东西让我感到耳目一新.


Vij*_*rpl 6

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

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


Krz*_*soń 5

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

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