最初の例では、静的コンストラクターで変更しています。これは許可されています。他の静的メソッド/プロパティで変更した場合は、コンパイラエラーになります。
static readonly
2番目の例では、非静的コンストラクターのメンバーを変更しようとしていますが、これは許可されていません。
コンストラクターでのみ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; }