C# 在C中调用任何静态方法之前初始化静态字段#

C# 在C中调用任何静态方法之前初始化静态字段#,c#,static-methods,C#,Static Methods,在我的类中,有几个具有以下签名的方法: public static void SomeMethod() { ... } 这些方法中的大多数依赖于私有静态字段的值。 在调用这些静态方法之前,调用方必须有任何方法为该字段赋值 我希望有一个随机对象供应用程序中的所有类使用。如何传递对此对象的引用以在另一个类的静态方法中使用它? 我在类中有一个带有静态方法和静态初始值设定项的私有静态字段: public static void Init(Random random) { _random = ra

在我的类中,有几个具有以下签名的方法:

public static void SomeMethod()
{
 ...
}
这些方法中的大多数依赖于私有静态字段的值。 在调用这些静态方法之前,调用方必须有任何方法为该字段赋值

我希望有一个随机对象供应用程序中的所有类使用。如何传递对此对象的引用以在另一个类的静态方法中使用它?
我在类中有一个带有静态方法和静态初始值设定项的私有静态字段:

public static void Init(Random random)
{
  _random = random;
}
但如何确保调用了初始值设定项?在我看来,在每个方法中执行检查并抛出异常是多余的。可能还有另一种选择


最后,我找到了一个可接受的解决方案:

  • 在包含应用程序入口点的类中定义public static属性:
    public static Random Rnd{get;}=new Random()

  • 在其他类中定义
    private static Random\u 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
    }
    

    我知道静态构造函数。但在我的例子中,静态字段的值取决于外部代码。那么这不是静态的,给我们举个例子。你的问题太宽泛了,所以它是重复的。如果你认为你的问题是不同的,请详细说明以显示差异。具体点@suIn更详细地说,我希望有一个随机对象供应用程序中的所有类使用。如何传递对此对象的引用以在另一个类的静态方法中使用它?我在该类中有一个带有静态方法的私有静态字段和一个静态初始值设定项:publicstaticvoidinit(Random Random){u Random=Random;}。但如何确保调用了初始值设定项?在我看来,在每个方法中执行检查并抛出异常是多余的。可能还有另一种选择。我想我的问题有一点不同:静态构造函数没有参数。我觉得你应该重新考虑设计。使它们成为实例方法,并仅公开接受字段初始值的构造函数。然后创建该对象的单个实例,并使其在需要的任何地方都可用(例如使用DI)。在包含应用程序入口点的类中定义public static属性:public static Random Rnd{get;}=new Random();2.在其他类中定义私有静态随机_Random;我想重点是不能在静态构造函数中初始化静态变量?你实际上是在以一种迂回的方式这样做。不清楚为什么不能在这里使用静态构造函数。(你不能用你建议的方法指定一个自定义的
    Random
    )。为包含此代码的其他类实现静态构造函数:Type Type=Assembly.getExecutionGassembly().EntryPoint.DeclaringType;var randomTypeProperties=type.GetProperties()。其中(p=>p.PropertyType==typeof(Random));foreach(randomTypeProperties中的var propertyInfo){u random=(random)propertyInfo.GetValue(null);}