は、次のシグネチャを持ついくつかの方法があります。初期静的フィールドC#での静的メソッドを呼び出すbefor私のクラスで
public static void SomeMethod()
{
...
}
これらのメソッドのほとんどはプライベート静的フィールドの値に依存します。 これらの静的メソッドのいずれかを呼び出す前に、呼び出し元がこのフィールドに値を割り当てる方法が必要でした。
アプリケーション内のすべてのクラスで使用する単一のランダムオブジェクトが必要です。このオブジェクトへの参照を別のクラスの静的メソッドで使用するにはどうすればよいですか? は、私は、静的メソッドと静的初期化子を持つクラスにプライベート静的フィールドを持っている:
public static void Init(Random random)
{
_random = random;
}
しかし、初期化子が呼び出されたことを確認する方法?チェックを行い、すべてのメソッドで例外をスローするには、私は冗長に思えます。別の選択肢があるかもしれません。
は、アプリケーションのエントリポイントを含むクラスにパブリック静的プロパティを定義します:
は最後に、私は私のために許容される溶液見つけ
public static Random Rnd { get; } = new Random();
は、他のクラスで
private static Random _random
を定義します。それはすべての静的コンストラクタの後であるので、私は、答えとして@Andyからのメッセージにマークを付けることができますType type = Assembly.GetExecutingAssembly().EntryPoint.DeclaringType; var randomTypeProperties = type.GetProperties().Where(p => p.PropertyType == typeof(Random)); foreach (var propertyInfo in randomTypeProperties) { _random = (Random)propertyInfo.GetValue(null); }
:
は、このコードが含まれ、他のクラスの静的コンストラクタを実装します。
ディスカッションに参加した皆様、ありがとうございます。
これは決して学ぶのが遅すぎることはありません。
public sealed class RandomAsSingleton : Random
{
private static volatile RandomAsSingleton _instance;
private static readonly object _syncRoot = new object();
private RandomAsSingleton() { }
public static RandomAsSingleton Instance
{
get
{
lock (_syncRoot)
{
if (ReferenceEquals(_instance, null)) { _instance = new RandomAsSingleton(); }
return _instance;
}
}
}
}
私の以前のソリューションは、今の私には少し醜いようだ:私はデザインパターンについて読んとして昨日、私はSingltonは私がまさに必要であることに気づきました。
を使用することがあります:静的コンストラクタは、パラメータはありません。 –
デザインを再考する必要があるように私には聞こえます。それらを* instance *メソッドにし、フィールドの初期値を受け入れるコンストラクタだけを公開します。次に、オブジェクトの単一のインスタンスを作成し、それが必要とされるあらゆる場所で(例えばDIで)利用可能にします。 –
最後に、私には受け入れられる解決策が見つかりました: 1.アプリケーションのエントリポイントを含むクラスのpublic staticプロパティを定義します。 public static Random Rnd {get; } =新しいランダム(); 2.他のクラスのプライベートスタティックランダム_randomを定義します。 –