2

次のように使用する定数値を生成しようとしています。

public class Foo()
{
    public const String ExtensionKey = Guid.NewGuid().ToString();
    public int ID { get; set; }
}

コンパイラはエラーをスローしています:

The expression being assigned to 'Foo.ExtensionKey' must be constant

コンパイル時にメソッド (コンストラクターまたは型初期化子) を実行できないことはわかっています。ExtensionKeyランダムに生成された Guidを異なるクラスの異なる定数に割り当てるための回避策を探しています。

編集:

その意図は、タイプごとに UNIQUE Guid を生成することです。Guid 値は、すべてのオブジェクト インスタンスで同じである必要があり、アプリケーションが実行されるたびに同じである必要があります。これはの振る舞いでConstあり、私はそれを尊重する方法を探しています.

4

4 に答える 4

5

(この回答の多くは、質問へのコメントから「促進」されました。)

Visual Studioでは、 [ツール]-[GUIDの作成]を選択できます。または、WindowsPowerShellでは次のように言うことができます[Guid]::NewGuid().ToString()。それはあなたに与えるでしょうGuidstring次に、その特定のGuidの文字列表現を定数にすることができます。

public const string ExtensionKey = "2f07b447-f1ba-418b-8065-5571567e63f6";

もちろん、これGuidは固定されています。マークされたフィールドconstは常にstaticです(ただし、staticキーワードを指定しないでください。暗黙的に示されます)。

タイプのフィールドが必要な場合は、C#Guidで宣言することはできません。const次に、次のようにします。

public static readonly Guid ExtensionKey = new Guid("2f07b447-f1ba-418b-8065-5571567e63f6");

readonlyつまり、フィールドはstatic同じクラスの(この場合)コンストラクターからのみ変更できます(派生クラスのコンストラクターはOKではありません)。

于 2013-01-26T14:37:45.240 に答える
4

を呼び出すとGuid.NewGuid()、毎回新しい GUID が返されるため、例外が発生します。固定 GUID 文字列を に置き換え たり、使用constしたりできます。readonlystaticconst

public class Foo
{
    // Fixed "forever" or until you manually change it
    // Cannot be changed in run-time
    public const String ExtensionKey = "3c88c196-06ec-4a89-bffa-6f3fd221f425";

    // You will get a new GUID per each Application Domain and per each run
    // Can be changed
    public static String ExtensionKey1 = Guid.NewGuid().ToString();

    // By convention this shall be private, as it's a field
    // You will get a new GUID per each instance of a class,
    // Once assigned, the value cannot be changed
    public readonly String ExtensionKey3 = Guid.NewGuid().ToString();

    // You will get a new GUID per each Application Domain and per each run,
    // Once assigned, the value cannot be changed
    public static readonly String ExtensionKey4 = Guid.NewGuid().ToString();
}

編集

その意図は、タイプごとに UNIQUE Guid を生成することです。Guid 値は、すべてのオブジェクト インスタンスで同じである必要があり、アプリケーションが実行されるたびに同じである必要があります。

新しい GUID を手動で生成し、最初のオプションを使用します

    // Fixed "forever" or until you manually change it
    // Cannot be changed in run-time
    public const String ExtensionKey = "3c88c196-06ec-4a89-bffa-6f3fd221f425";
于 2013-01-26T11:01:18.647 に答える
3

constに置き換えることで、ほぼ同じ動作を得ることができますstatic readonly

public static readonly String ExtensionKey = Guid.NewGuid().ToString();
于 2013-01-26T10:58:10.770 に答える
1

この質問には少し詳細がありません。GUID をクラスとプロセスごとに一意にするか、クラスごとに一意にするか、プログラムを開始するたびに同じにするか。それは2つの非常に異なるものです。

クラスとプロセスごとに一意の GUID が必要な場合は、すでに有効な回答がいくつかありますが、プロセスごとではなくクラスごとに一意の GUID が必要な場合は、問題を解決する別の方法が必要です。コードに GUID を入力するか、クロックなどに基づく乱数ジェネレーターの代わりにテキストを入力として使用するある種の GUID ジェネレーターを使用します。

文字列からの GUID の生成に関するこのブログ投稿を読むことをお勧めします。実際のコードはGitHubにあります。

そのようなものを使用し、クラスの完全な名前を入力として使用すると、クラスごとに一意の GUID を取得できますが、すべてのプロセスで同じです

于 2013-01-26T11:18:50.563 に答える