2017-11-18 5 views
-1

は、次のシグネチャを持ついくつかの方法があります。初期静的フィールドC#での静的メソッドを呼び出すbefor私のクラスで

public static void SomeMethod() 
{ 
... 
} 

これらのメソッドのほとんどはプライベート静的フィールドの値に依存します。 これらの静的メソッドのいずれかを呼び出す前に、呼び出し元がこのフィールドに値を割り当てる方法が必要でした。

アプリケーション内のすべてのクラスで使用する単一のランダムオブジェクトが必要です。このオブジェクトへの参照を別のクラスの静的メソッドで使用するにはどうすればよいですか? は、私は、静的メソッドと静的初期化子を持つクラスにプライベート静的フィールドを持っている:

public static void Init(Random random) 
{ 
    _random = random; 
} 

しかし、初期化子が呼び出されたことを確認する方法?チェックを行い、すべてのメソッドで例外をスローするには、私は冗長に思えます。別の選択肢があるかもしれません。

  1. は、アプリケーションのエントリポイントを含むクラスにパブリック静的プロパティを定義します:

    は最後に、私は私のために許容される溶液見つけpublic static Random Rnd { get; } = new Random();

  2. は、他のクラスで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は私がまさに必要であることに気づきました。

  • +0

    を使用することがあります:静的コンストラクタは、パラメータはありません。 –

    +1

    デザインを再考する必要があるように私には聞こえます。それらを* instance *メソッドにし、フィールドの初期値を受け入れるコンストラクタだけを公開します。次に、オブジェクトの単一のインスタンスを作成し、それが必要とされるあらゆる場所で(例えばDIで)利用可能にします。 –

    +0

    最後に、私には受け入れられる解決策が見つかりました: 1.アプリケーションのエントリポイントを含むクラスのpublic staticプロパティを定義します。 public static Random Rnd {get; } =新しいランダム(); 2.他のクラスのプライベートスタティックランダム_randomを定義します。 –

    答えて

    0

    あなたは、私は私の質問には違いがあると思う静的コンストラクタ

    // Static constructor is called at most one time, before any 
    // instance constructor is invoked or member is accessed. 
    static SimpleClass() 
    { 
        // set your private static field 
    } 
    

    https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-constructors

    +0

    静的コンストラクタについて知っています。しかし、私の場合、静的フィールドの値は外部コードに依存します。 –

    +1

    それは静的ではない、例を示す。あなたの質問は広すぎて重複しています。あなたの質問が違うと思うならば、違いを見せるためにもっと精巧にしてください。具体的に。 @ retrograde.su –

    +0

    詳細には、アプリケーション内のすべてのクラスで使用する単一のRandomオブジェクトが必要です。このオブジェクトへの参照を別のクラスの静的メソッドで使用するにはどうすればよいですか? –

    関連する問題