2

C# の const および readonly キーワードについて読みました。これらのキーワードの違いの 1 つは、const の値がコンパイル時に解決されるのに対し、readonly キーワードは実行時に解決されることです。私のプロジェクトでそれらを実装する機会はありませんでしたが。そこで、やってみようと思いました。他のプロジェクトで使用する mylibrary を作成しました。mylibrary のコードは次のとおりです。

 namespace MyLibrary
 {
  public class Class1
  {
    public static readonly string MyVar = "Vikram";
    //public readonly string MyVar;
    //public Class1()
    //{
    //    MyVar = "Test";
    //}
  }
}

次のように、このライブラリを他のコンソール プロジェクトのリファレンスとして使用します。

class Program
{
    static void Main(string[] args)
    {
        //MyLibrary.Class1 class1 = new MyLibrary.Class1();
        Console.WriteLine(MyLibrary.Class1.MyVar); // output is vikram
        Console.ReadLine();
        Console.WriteLine(MyLibrary.Class1.MyVar); // changed to Test but still op as  vikram
        Console.ReadLine();
    }
}

これら 2 つの writeline の間で、ライブラリの「MyVar」の値を変更して再コンパイルします。readonly の概念に従って、メイン プロジェクトを再コンパイルせずにコンソール プロジェクトに反映されるはずです。

readonly キーワードの理解が間違っている場合は、修正してください。

PS私はこのリンクの答えを経験しました。回答の1つで、次のことが言及されています

readonly 値の場合は、メモリ位置への参照のようなものです。値は、AssemblyB の IL に焼き付けられません。つまり、メモリの場所が更新された場合、アセンブリ B は再コンパイルせずに新しい値を取得します。したがって、I_RO_VALUE が 30 に更新された場合は、AssemblyA をビルドするだけで済みます。すべてのクライアントを再コンパイルする必要はありません。

太い線が正確に何を意味するのか、誰か説明してください。これが私の例でやっていることだと思います。

4

5 に答える 5

3

あなたの理解は正しいですが、既に読み込まれているアセンブリを変更することはできません。プログラムを再起動する必要があります。

readonlyリフレクションでフィールドを変更できると思います。これにより、これをテストしやすくなります。

ところで、任意の初期化子を配置できるため、読み取り専用フィールドの値は実行時の値である必要があります。ランタイム値を静的に認識できないため、C# コンパイラでハードコードすることはできません。

于 2013-08-03T14:54:55.640 に答える
1

readonly 修飾子の意味を十分に理解していないと思います。詳細については、このリファレンスを確認してください。

次の行に注意してください。

public static readonly string MyVar = "Vikram";

その値を参照するたびMyVarに再評価されるという意味ではありません。
の値MyVarが設定されると、再度変更されることはなく、それ以降は読み取り専用になることを意味します。

たとえば、次の行:

public class Class1
{
    public static readonly string MyVar;

    public Class1()
    {
        MyVar = SomeCalculation();
    }

    Console.WriteLine(MyLibrary.Class1.MyVar);
    Console.WriteLine(MyLibrary.Class1.MyVar);
}

一度だけトリガーSomeCalculation()します!

于 2013-08-03T15:03:50.997 に答える
0

読み取り専用: メモリは実行時に割り当てられ、値は実行時に初期化されます。

定数: "const" キーワードを使用します。値は宣言時に割り当てられます。この値は、プログラム全体で一定です。例えば。const int i=5;

于 2013-08-03T16:26:42.847 に答える
0

AssemblyA をビルドするだけです。すべてのクライアントを再コンパイルする必要はありません。

アッセンブリーAとアッセンブリーがありBます。アセンブリAには、次のような const 式がどこかに含まれています。

public const int number = 10;

これnumberが assembly 内で使用される場合、コンパイラは変数Bの「生の」値をアセンブリのメタデータ内に単純に配置します。で が変更された場合、では何も変更されません。アセンブリに埋め込まれた値を変更するには、も再コンパイルする必要があります。この動作の利点の 1 つは、 assemblyを使用するためにアセンブリを読み込む必要がないことです。numberBnumberABBBAB

ただし、readonlyこの観点では、他のすべての (インスタンス|クラス) フィールドと同じように機能します。静的な方法のようには機能しませんconst(constはクラスレベル変数のみと見なされ、インスタンス変数ではありません)

于 2013-08-04T17:01:15.417 に答える
0

ブログのキーワードについて少し読んだ後、記事を書きました

ブログ定数からの抜粋

  • 定義時に const フィールドに値を提供します。
  • 次に、コンパイラは定数の値をアセンブリのメタデータに保存します
  • 定数は、インスタンス メンバーではなく、常に静的メンバーと見なされます。
于 2015-07-14T04:57:06.970 に答える