一段时间后,静态变量将重置为null

时间:2013-12-13 14:28:13

标签: c# list constructor static

我有一个static member这是一个列表,看起来它有时会由于某种原因(可能是在未捕获的异常之后)重置为null。 这是我的代码:

public abstract partial class MyClass
{
            private static List<MyClass> Types;

            static MyClass()
            {
                Types = new List<MyClass>();
                Types.Add(new Myclass(0));
                Types.Add(new Myclass(1));
            }


            public static MyClass GetMyClass(int id)
            {                
                return Types.Single(x => x.id == id);
            }
}

GetMyClass方法将触发null引用异常。 我的代码中没有任何地方可以将此成员设置为null。 你有什么想法吗?

以下是完整的代码,如果可以提供帮助:

public partial class TestRequest
{
    public abstract partial class TrType
    {
        private static List<TrType> Types;

        static TrType()
        {
            Types = new List<TrType>();
            Types.Add(TrType.Real.Instance);
            Types.Add(TrType.Template.Instance);
        }
        protected int idTrType;

        public static TrType GetTrType(int id)
        {
            return Types.Single(x => x.idTrType == id);
        }

        public int IdTrType
        {
            get { return idTrType; }
            set { idTrType = value; }
        }

        public abstract void Launch(TestRequest tr);
    }
}

// In another file.

public partial class TestRequest
{
    public partial class TrType
    {
        public class Real : TestRequest.TrType
        {
            private static Real instance;
            public const int ID = 1;

            protected Real()
            {
                idTrType = ID;
            }

            static Real()
            {
                instance = new Real();
            }

            public static Real Instance
            {
                get { return instance; }
                set { instance = value; }
            }

            public override void Launch(TestRequest tr)
            {
                // do something
            }
        }
    }
}

4 个答案:

答案 0 :(得分:3)

我相信你因为Single而得到例外。 (不是NRE)

  

Single(IEnumerable)方法抛出异常   如果输入序列为空。在输入时返回null   sequence为空,使用SingleOrDefault。

尝试:

 return Types.SingleOrDefault(x => x.id == id);

如果没有找到,则返回null。但如果在id

中找到多个项目,您仍会收到异常

答案 1 :(得分:2)

我不知道为什么会重置为null。如何将它设置为只读,这样它只能在静态构造函数中设置,永远不会被更改。但是,该列表可以稍后修改。

    public abstract partial class MyClass
    {
        private static readonly List Types;

        static MyClass()
        {
            Types = new List<MyClass>();
            Types.Add(new Myclass(0));
            Types.Add(new Myclass(1));
        }


        public static MyClass GetMyClass(int id)
        {
            return Types.Single(x => x.id == id);
        }
    }

答案 2 :(得分:0)

问题可能在于您没有向我们展示的代码。关于这个静态私有变量的NRE可以通过使变量只读来解决。

仔细观察有一些问题:

  1. 这是一个部分类。很可能这意味着某些事情已被排除在示例之外并导致问题。可访问性是私有的,因此变量只能由包含类设​​置为null。 OP中没有显示任何会导致变量“重置为null”的内容。但是,将变量标记为只读(使类不可变)将解决此类型的运行时错误,并避免由该类的其他成员引起的副作用。

  2. Types.Add(new Myclass (0));存在套管问题。我认为这只是一个类型o而不是一个尚未解释的设计问题(例如继承)。

  3. 我们没有x.id的定义。它可能是一个新的类,它可能是部分的扩展(我们需要#2的答案才能确定)。如果x.id可以为空且x为空,则会导致NRE。 请注意,如果Types为空,则不会收到NRE,如果Types为空

答案 3 :(得分:0)

好的,我终于可以重现这个问题了。 我从一开始就错了。 NRE是由Linq表达式引起的:

Types.Single(x => x.id == id);

'x'将为null(不是我认为的类型),当我首先访问“Real”实例时(在TrType初始化之前),这可能会发生。在这种情况下,调用“Real”的静态构造函数以实例化“instance”属性。由于“Real”继承自“TrType”,因此调用“TrType”的静态构造函数,并开始“类型”列表构造。然后它尝试插入仍然处于instanciated过程中的“Real”实例,因此当时仍为null。然后我们在列表中有一个“null”对象......

感谢大家的参与。