我有一个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
}
}
}
}
答案 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可以通过使变量只读来解决。
仔细观察有一些问题:
这是一个部分类。很可能这意味着某些事情已被排除在示例之外并导致问题。可访问性是私有的,因此变量只能由包含类设置为null。 OP中没有显示任何会导致变量“重置为null”的内容。但是,将变量标记为只读(使类不可变)将解决此类型的运行时错误,并避免由该类的其他成员引起的副作用。
Types.Add(new
Myclass (0));
存在套管问题。我认为这只是一个类型o而不是一个尚未解释的设计问题(例如继承)。
我们没有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”对象......
感谢大家的参与。