初始化静态字段,然后再调用在C#中的任何静态方法
在我的课有几种方法具有以下签名:初始化静态字段,然后再调用在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;
}
}
}
}
我以前的解决方案,现在在我看来有点难看。
你可能想使用一个静态构造函数
// 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
}
我知道静态构造函数。但在我的情况下,静态字段的值取决于外部代码。 –
那么这不是静态的,向我们展示示例。你的问题太广泛,所以它的重复。如果你认为你的问题不同,请详细说明,以显示不同之处。更加详细一些。 @ retrograde.su –
更详细地说,我想要一个单独的Random对象供应用程序中的所有类使用。我如何传递对这个对象的引用来在另一个类的静态方法中使用它? –
我想我的问题有一个区别:一个静态构造函数没有参数。 –
这听起来像你应该重新考虑设计。使它们成为* instance *方法,并只公开一个接受该字段初始值的构造函数。然后创建该对象的单个实例,并在需要的任何地方使用该实例(例如,使用DI)。 –
最后我找到了适合我的解决方案: 1.在包含应用程序入口点的类中定义公共静态属性: public static Random Rnd {get; } = new Random(); 2.在其他类中定义private static Random _random; –