4

このようなコードを持つ:

    public static readonly bool MaximumRecipientsReached;
    private static readonly IList<EmailAddress> Contacts;

    static AdditionalRecipient()
    {
        Contacts = AnotherClass.Contacts; //works
    }

    public AdditionalRecipient()
    {
        MaximumRecipientsReached = true; //works not
    }

プライベート静的読み取り専用フィールドを変更できるのに、パブリックフィールドは変更できないのはなぜですか?

PS:もちろん私はプロパティを使用しています。

4

4 に答える 4

13

最初の例では、静的コンストラクターで変更しています。これは許可されています。他の静的メソッド/プロパティで変更した場合は、コンパイラエラーになります。

static readonly2番目の例では、非静的コンストラクターのメンバーを変更しようとしていますが、これは許可されていません。

コンストラクターでのみstatic readonlyメンバーを変更できます。staticこのように考えると、staticコンストラクターは1回実行され、その後、インスタンスごとにインスタンスコンストラクターが呼び出されます。readonlyすべてのインスタンスがプロパティを変更できる場合、プロパティはそれほど大きくありません。

もちろん、コンストラクターで非static readonlyインスタンスメンバーを変更することもできます。

public static readonly bool MaximumRecipientsReached = false;
public readonly bool MyInstanceReadonly = false;

static AdditionalRecipient()
{
    // static readonly can only be altered in static constructor
    MaximumRecipientsReached = true; 
}

public AdditionalRecipient()
{
    // instance readonly can be altered in instance constructor
    MyInstanceReadonly = true;  
}

また、あなたの「PS:もちろん私はプロパティを使用しています」と混乱しています。プロパティを宣言することはできませんreadonly。これらをプロパティにし、readonly-ishにしたいprivate set場合は、もちろんバッキングフィールドを使用していない限り、プロパティを作成する必要があります。私がこれを取り上げる主な理由は、プライベートセットでプロパティを使用すると、クラス自体が任意のメソッドまたはコンストラクターでプロパティ(静的またはインスタンス)を変更できるため、コードが実行しようとしていることを実行できるためですが、コードクラス外ではできません。

// public getters, private setters...
public static bool MaximumRecipientsReached { get; private set; }
public static IList<EmailAddress> Contacts { get; private set; }
于 2012-07-05T13:42:31.627 に答える
2

これは、パブリックコンストラクターとプライベートコンストラクターとは関係ありませんが、静的コンストラクターと非静的コンストラクターとは関係ありません。

非静的コンストラクターで静的読み取り専用アイテムを設定しようとすると(2番目の場合のように)、コンパイラーは次のように文句を言います。

静的読み取り専用フィールドを割り当てることはできません(静的コンストラクターまたは変数初期化子を除く)

これは、静的メンバーが型の最初のアクセス時に初期化されるためです。これは、通常のコンストラクターが呼び出される前である可能性があります。静的な読み取り専用メンバーをインスタンスコンストラクターから変更できるようにすることは意味がないため、コンパイラーはそれを防ぎます。

関連するメンバーを非静的にするか、初期化を静的コンストラクターに入れるだけです。

于 2012-07-05T13:43:07.220 に答える
1

MaximumRecipientsReachedは読み取り専用の静的であり、非静的コンストラクターから設定しようとしています。静的コンストラクター内でのみ設定できます。

于 2012-07-05T13:43:16.993 に答える
0

これは、静的コンストラクターは他の静的メンバーでのみ使用でき、非静的コンストラクターはオブジェクトをインスタンス化する必要があるためです。したがって、クラスをインスタンス化しても、クラスに静的コンストラクターがある場合、コンストラクターは呼び出されません。

于 2012-07-05T13:45:39.737 に答える