web-dev-qa-db-ja.com

C#におけるJavaのfinalと同等のものは何ですか?

C#におけるJavaのfinalと同等のものは何ですか?

527
Nosrama

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氏が指摘しているように、ここでの2つの言語の大きな違いは、Javaはデフォルトですべての非静的メソッドをvirtualとしてマークし、C#はsealedとしてマークするということです。したがって、基本クラスで明示的にsealedとマークされているメソッドをさらにオーバーライドしたくない場合は、C#でvirtualキーワードを使用するだけで済みます。

変数

変数の割り当てを1回だけ許可するには

Java

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

C#

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

注意として、readonlyキーワードの効果は、 const キーワードの効果と異なり、readonly式はコンパイル時ではなくランタイムで評価されます。任意の表現を許可します。

820
Noldorin

状況によって異なります。

167
LukeH

ここで全員が欠けているのは、最終メンバー変数に対する確実な代入のJavaによる保証です。

最終メンバー変数Vを持つクラスCの場合、Cのすべてのコンストラクターを通る可能なすべての実行パスは、Vを正確に1回割り当てる必要があります。

C#のreadonlyキーワードにはそのような保証はありません - コンパイラはreadonlyメンバを未割り当てのままにしておくか、コンストラクタ内で複数回割り当てることができて幸せです。

そのため、finalとreadonly(少なくともメンバー変数に関して)は絶対に同等ではありません - finalははるかに厳密です。

41
Some guy

Javaクラスfinalとメソッドfinal - > sealed Javaメンバ変数final - >ランタイム定数はreadonly、コンパイル時定数はconst.

ローカル変数finalおよびメソッド引数finalに相当するものはありません

6
Vijayakumarpl

前述のように、sealedはメソッドやクラスのfinalと同等です。

残りは複雑です。

  • 宣言で定義された(静的)定数では、それがプリミティブ型または不変クラスであれば、constは同等と見なすことができます。
  • コンストラクタを離れた後で再割り当てしてはいけないフィールドでは、readonlyを使用できますが、等しくはありません - finalは、コンストラクタ内でも1つの代入が必要です。
  • 一度だけ割り当てられることになっているローカル変数は、C#では作成できないと思います。なぜあなたは誰がそれを必要とするのか疑問に思っているなら:あなたはいくつかのif-else、 switch-case またはその前に変数を宣言することができます。それをfinalとして宣言することによって、あなたはそれが厳密に一度だけ代入されることを強制します。そうでなければ、コンパイラエラーが起こります。これには正しく動作するコードが必要なので、エラーは少なくなります。

まとめると、C#にはfinalと直接同等のものはありません。 JavaにはC#のNice機能がいくつか欠けていますが、C#が同等の機能を提供できない場所を知ることは、ほとんどJavaプログラマーである私にとっては爽快です。

6
Vlasec

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

C#定数は、コンパイル時定数にはconstキーワード、ランタイム定数にはreadonlyキーワードを使用して宣言されます。定数の意味は、C#言語とJava言語の両方で同じです。

5

封印

0
x2.