在我的課有幾種方法具有以下簽名:初始化靜態字段,然後再調用在C#中的任何靜態方法
public static void SomeMethod()
{
...
}
這些方法大多依賴於私有靜態字段的值。 在調用這些靜態方法之前,調用方必須有任何方法爲該字段賦值。
我想有一個單獨的隨機對象供應用程序中的所有類使用。我如何傳遞對這個對象的引用來在另一個類的靜態方法中使用它? 我與靜態方法和靜態初始化類中的私有靜態字段:
public static void Init(Random random)
{
_random = random;
}
但是,如何確保初始化被稱爲?爲了在每種方法中進行檢查並拋出異常,對我來說似乎是多餘的。可能有另一種選擇。
終於讓我找到了我一個可接受的解決方案:
定義中包含應用程序入口點的類公共靜態屬性:
public static Random Rnd { get; } = new Random();
在其他類別定義
private static Random _random
;爲包括該代碼的其他類實現靜態構造函數:
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); }
我可以標記從@Andy消息作爲答案,因爲它是所有靜態構造函數後。
謝謝大家參與討論。
學習永遠不嫌晚。昨天,當我讀到的設計模式,我意識到Singlton是正是我需要的:
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;
}
}
}
}
我以前的解決方案,現在在我看來有點難看。
我想我的問題有一個區別:一個靜態構造函數沒有參數。 –
這聽起來像你應該重新考慮設計。使它們成爲* instance *方法,並只公開一個接受該字段初始值的構造函數。然後創建該對象的單個實例,並在需要的任何地方使用該實例(例如,使用DI)。 –
最後我找到了適合我的解決方案: 1.在包含應用程序入口點的類中定義公共靜態屬性: public static Random Rnd {get; } = new Random(); 2.在其他類中定義private static Random _random; –