final
C#の Java に相当するものは何ですか?
7 に答える
このfinal
キーワードには、Java でいくつかの用法があります。使用されるコンテキストに応じて、C# のキーワードsealed
とキーワードの両方に対応します。readonly
クラス
サブクラス化 (定義されたクラスからの継承) を防ぐには:
ジャワ
public final class MyFinalClass {...}
C#
public sealed class MyFinalClass {...}
メソッド
メソッドのオーバーライドを防ぎますvirtual
。
ジャワ
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 回だけ許可するには、次のようにします。
ジャワ
public final double pi = 3.14; // essentially a constant
C#
public readonly double pi = 3.14; // essentially a constant
補足として、キーワードの効果は、式がコンパイル時ではなく実行時に評価されるreadonly
という点でキーワードの効果とは異なるため、任意の式が許可されます。const
readonly
それは文脈に依存します。
final
クラスまたはメソッドの場合、C # に相当するものはsealed
.final
フィールドの場合、C # に相当するものはreadonly
.final
ローカル変数またはメソッド パラメーターの場合、C# に直接相当するものはありません。
ここに誰もが欠けているのは、Java が final メンバー変数の明確な代入を保証していることです。
最終メンバー変数 V を持つクラス C の場合、C のすべてのコンストラクターを通るすべての可能な実行パスは、V を 1 回だけ割り当てる必要があります。V の割り当てに失敗したり、V を 2 回以上割り当てたりすると、エラーが発生します。
C# の readonly キーワードには、そのような保証はありません。コンパイラは、readonly メンバーを割り当てられていないままにしておくか、コンストラクター内でそれらを複数回割り当てることを許可します。
そのため、final と readonly (少なくともメンバー変数に関して) はまったく同等ではありません。final ははるかに厳密です。
前述のように、for メソッドとクラスにsealed
相当します。final
残りは複雑です。
static final
フィールドの場合、可能static readonly
な限り最も近いものです。これにより、静的コンストラクターで静的フィールドを初期化できます。これは、Java の静的初期化子とかなり似ています。これは、定数 (プリミティブと不変オブジェクト) と可変オブジェクトへの定数参照の両方に適用されます。修飾子は定数の
const
場合とかなり似ていますが、静的コンストラクターで設定することはできません。コンストラクターを離れたら再割り当てしてはならないフィールドで
readonly
使用できます。ただし、等しくはありませんfinal
。コンストラクターまたはイニシャライザーでも、割り当ては 1 つだけ必要です。final
私が知っているローカル変数に相当する C# はありません。なぜ誰かがそれを必要とするのか疑問に思っている場合: if-else、switch-caseなどの前に変数を宣言できます。final を宣言することで、最大 1 回割り当てられるように強制します。一般に、Java ローカル変数は、読み取る前に少なくとも 1 回割り当てる必要があります。値が読み取られる前に分岐が飛び出さない限り、最終的な変数は 1 回だけ割り当てられます。これらはすべてコンパイル時にチェックされます。これには、エラーの余地が少なく、適切に動作するコードが必要です。
要約すると、C# には に直接相当するものはありませんfinal
。Java には C# の優れた機能がいくつか欠けていますが、Java プログラマーである私にとっては、C# が同等の機能を提供できない場所を確認できて新鮮です。
Java クラスの final とメソッドの final -> 封印。Java メンバ変数 final -> 実行時定数は readonly、コンパイル時定数は const。
ローカル変数 final とメソッド引数 final に相当するものはありません
C# 定数は、コンパイル時定数の const キーワードまたは実行時定数の readonly キーワードを使用して宣言されます。定数のセマンティクスは、C# 言語と Java 言語の両方で同じです。
密封された