C#が同じ行でconstとstaticを許可しないのはなぜですか?Javaでは、定数として機能するために、フィールドを「static」および「final」として宣言する必要があります。C#でconstをfinalとして宣言できないのはなぜですか?
私はさらに、Javaでは、これが明示的に宣言されているかどうかに関係なく、すべてのインターフェースがパブリックで抽象的であることを区別します。constは本質的に事実上静的ではありませんか?なぜC#はこれを嫌うのですか?
constとstaticは、実際には異なること、異なるストレージメカニズム、異なる初期化を意味します。staticは読み取り/書き込みであるため、ストレージ用にメモリを割り当て、実行時に初期化する必要があります。スタティックは、リテラル値または式で初期化できます。対照的に、constは不変であり、コンパイル時定数(通常はリテラル値、またはコンパイル時に完全に評価できる式)で初期化する必要があります。値はコンパイル時に既知であるため、生成されたコードに直接埋め込むことができるため、実行時にストレージを割り当てる必要はありません。
定数はその性質上静的であるため、冗長になります。
前に述べたように、 Javaのstatic finalは、C#のstaticreadonlyと同じです。実際、このメンバーは静的であり、その内容は変更できないと言っています。また、どちらの場合も静的コンストラクターからの値を指定できます。
しかし、C#のconstはまったく別のものです。これは、C( DEFINEディレクティブ)の定数の線に沿っていますが、OOPを念頭に置いています。定数であるため静的です。すべてのインスタンスが同じ値のこの定数を持ち、コンストラクターはそれを設定できません。また、誰かがインスタンスを作成せずに定数にアクセスしたい場合もあります。あなたがそれについて考えるとき、非静的定数は単に意味がありません。定数はオブジェクトの一部ではないとほぼ言えます。定数は、コンテキスト、つまり強力な名前を提供するために使用するだけです。
Javaにはconstに相当するものはありません。静的なfinalはDEFINEと同等であるとどこかで読むことができますが、それは非常にあいまいです。完全に異なるメカニズムで、共通点はありませんが、最終的にはコードの結果は同じになります。つまり、コードの保守性と可読性が向上します。
C#の定数は静的メンバーではないため、静的メンバーとして考えるのをやめる必要があります。それらをDEFINEのOOPバージョンと考えてください。カプセル化を検討する場合、 finalフィールドとreadonlyフィールドの唯一の理由は、独自のコードが誤ってその値を変更するのを防ぐためです。そして、それは私には一定のようには聞こえません。
要約:
確かに、C#constは静的を意味しますが、C#には、キーワードreadonlyにJavaの最後のキーワードと同等のものがあります。
したがって、実際には、C#ではconst finalが許可されており、C#では静的な読み取り専用です。
固有の修飾子を許可する場合と不要にする場合は、混乱を招く可能性があるためです。あなたが見たら
static const int A = 3
const int B = 5
あなたはそれらが2つの異なる種類の定数であると信じるかもしれません。
VB 2008(必要に応じて非常に冗長になる可能性があります)でさえ、それを許可していません。