回答:
finalキーワードは、Javaでいくつかの用途があります。これは、両方に対応sealedし、readonlyそれが使用される文脈に応じて、C#のキーワード。
サブクラス化(定義されたクラスからの継承)を防ぐには:
ジャワ
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明示的にマークさvirtualれているメソッドのオーバーライドをこれ以上停止しない場合は、C#でキーワードを使用するだけで済みます。
変数を1回だけ割り当てることを許可するには:
ジャワ
public final double pi = 3.14; // essentially a constant
C#
public readonly double pi = 3.14; // essentially a constant
サイドノートとしての効果readonlyとは異なるキーワードconstのキーワードは、その中でreadonly発現がで評価されたランタイムではなく、コンパイル時したがって任意の表現を可能にします。
readonlyメンバー変数は、コンストラクターで変更できます。pastebin.com
状況によります。
finalクラスまたはメソッド、C#の同等ですsealed。finalのフィールド、C#の同等ですreadonly。finalローカル変数やメソッドのパラメータ、は直接C#の同等はありません。For a final local variable or method parameter, there's no direct C# equivalent大きな違いがあります。
const値タイプでのみ使用できます。私が知る限り、ローカル参照型の効果的な定数を作成する方法はありません。
ここで欠けているのは、Javaによる最終メンバー変数の明確な割り当ての保証です。
最終メンバー変数Vを持つクラスCの場合、Cのすべてのコンストラクターを通るすべての実行パスは、Vを1回だけ割り当てる必要があります。Vの割り当てに失敗したり、Vを2回以上割り当てると、エラーが発生します。
C#のreadonlyキーワードにはそのような保証はありません。コンパイラーは、readonlyメンバーを未割り当てのままにするか、コンストラクター内で複数回割り当てることを許可します。
したがって、finalとreadonly(少なくともメンバー変数に関して)は明らかに同等ではありません。finalははるかに厳密です。
前述したように、sealedはfinalメソッドとクラスのと同等です。
残りは複雑です。
以下のためにstatic finalフィールド、static readonly可能最も近いものです。静的コンストラクターで静的フィールドを初期化できます。これは、Javaの静的初期化子によく似ています。これは、定数(プリミティブと不変オブジェクト)と、可変オブジェクトへの定数参照の両方に適用されます。
const修飾子は、定数のかなり似ていますが、あなたは、静的コンストラクタでそれらを設定することはできません。
readonly使用できます。それは等しくありません- finalコンストラクタまたはイニシャライザでも正確に1つの割り当てが必要です。final私が知っているローカル変数に相当するC#はありません。なぜだれがそれを必要とするのか疑問に思っている場合:if-else、switch-caseなどの前に変数を宣言できます。最終的に宣言することにより、割り当ては最大で1回に制限されます。
一般に、Javaローカル変数は、読み込まれる前に少なくとも1回割り当てる必要があります。値が読み取られる前に分岐が飛び出さない限り、最終的な変数は1回だけ割り当てられます。これはすべてコンパイル時にチェックされます。これには、エラーに対するマージンが少ない、適切に動作するコードが必要です。
まとめると、C#にはに直接相当するものはありませんfinal。JavaにはC#の優れた機能がいくつかありますが、ほとんどの場合Javaプログラマーとして、C#が同等の機能を提供できない場所を確認することは、私にとっては新鮮です。
Javaクラスfinalおよびメソッドfinal->封印。Javaメンバー変数final->ランタイム定数の場合は読み取り専用、コンパイル時定数の場合はconst。
ローカル変数finalとメソッド引数finalに相当するものはありません
C#定数は、コンパイル時の定数にはconstキーワードを使用して宣言され、ランタイム定数にはreadonlyキーワードを使用して宣言されます。定数のセマンティクスは、C#言語とJava言語の両方で同じです。