4

クラスレベルの文字列定数とメソッドレベルの文字列定数の間に大きな違いはありますか?コンパイラは定数を認識し、定数畳み込みを適用しますか?または、nwオブジェクトは常に作成されますか?

次に例を示します。クラスレベルの定数

class A
    {
        private const string Sid = "sid";
        private const string Pid = "pid";

        public void Do()
        {
            Console.WriteLine(Sid);
            Console.WriteLine(Pid);
        }
    }

メソッドレベルの定数:

class B
    {
        public void Do()
        {
            const string Sid = "sid";
            const string Pid = "pid";

            Console.WriteLine(Sid);
            Console.WriteLine(Pid);
        }
    }
4

2 に答える 2

1

定数の違いはスコープにあります。非const宣言の場合と同様に、考慮すべき主なことは、これらの値にアクセスできる場所です。さて、どちらの宣言がよりクリーンであるかは、壮大な炎上戦争に値するほど無関係です...

于 2013-03-06T01:40:27.030 に答える
1

文字列定数は、真のオブジェクトであるため、新しい「インライン」*です。コンパイラは常に、一緒に追加された同じ文字列定数の部分をマージします(つまり、「a」+「b」は「ab」を指定することと同じです)。

文字列定数は「インターン」することもできます。つまり、同じ値のすべての定数が同じ実際の文字列オブジェクトを参照していることを意味します(私の知る限り、C#コンパイラは常にそれを行います)。

数値定数は、コンパイル時に常に可能な限り計算されることに加えて、使用される場所に「インライン化」することができます(つまり、2 * 2 * 4は16を指定するのと同じです)。

「共有定数」の動作を実現するreadonlyには、の代わりにフィールドを使用する必要がありconstます。

*共有値を参照する代わりに、結果のコードに直接配置される「インライン」。

于 2013-03-06T01:53:57.417 に答える