C#从不同的类初始化静态变量

时间:2019-07-17 14:32:01

标签: c#

我拥有的是:

public static class IDs {

    public static string someID { get; set; }

    static IDs() {
        log.info(someID);
        // use someID here
    }
}

public class otherClass {

     public void otherMethod(string sym) {
         IDs.someID = sym;
     }
}

,然后使用otherClass的实例,如下所示:

otherClassInstance.otherMethod("someStringSymbol");

我没有任何构建错误,但是log.info(someID);正在打印null
我以为它是someStringSymbol

2 个答案:

答案 0 :(得分:3)

这是因为静态构造函数is called automatically before the first instance is created or any static members are referenced.

这意味着当otherClass的实例调用IDs.someID = sym;首先执行的操作是静态构造函数,即static IDs()中的代码。 / p>

目前,静态变量尚未初始化,您基本上正在执行log.info(null);

静态构造函数完成后,变量将被初始化,因此在otherMethod的第一次引用之后,您应该能够在IDs中看到其值。


考虑到OP的要求:

我想在switch语句中使用someID中传递的值

解决方案可以是在explicit getters and setters的帮助下,只要设置新值就简单地执行静态方法:

public static class IDs
{
    private static string _someID; // backing field

    public static string SomeID
    {
        get { return _someID; }

        set
        {
            _someID = value;
            DoSomethingWithSomeID();
        }
    }

    private static DoSomethingWithSomeID()
    {
        // Use SomeID here.

        switch (IDs.SomeID)
        {
            ...
        }
    }
}

public class OtherClass
{
    public void OtherMethod(string sym)
    {
        // This will set a new value to the property
        // and invoke DoSomethingWithSomeID.
        IDs.SomeID = sym;
    }
}
每次有人为DoSomethingWithSomeID设置新值时,都会调用

SomeID

答案 1 :(得分:1)

我认为您尝试做的事情不适合静态类。我会尝试以下

list1 = ['__light_grp1', '__light_grp1_direct', '__light_grp2', '__light_grp2_direct']
list2=[]
for i in list1:
    if i[-1:].isdigit():
        list2.append(i)