有没有比这更聪明的方法来保护foreach
循环免受 NullReference 异常的影响:
if (G_Locatie.OverdrachtFormulierList != null)
{
foreach (OverdrachtFormulier otherform in G_Locatie.OverdrachtFormulierList)
{
...
}
}
我使用了很多 foreach 循环,通常是嵌套的,还有很多变量,例如 G_Location 肯定存在,但是 datamember .OverdrachtFormulierList 可能还没有被分配一个列表使用new
。
亲爱的朋友,感谢您的所有评论。在了解了您的建议之后,虽然在准确理解方面遇到了很多麻烦,但在挖掘了我开始研究的千层面代码之后,经过一些实验,我发现最简单和最干净的方法就是简单地避免使用 NULL,通过适当的初始化。虽然我有点抗拒必须在我的代码中初始化 OverdrachtFormulierList,但有可能忘记一个实例,但我找到了初始化的适当位置,即在原始类定义中。
为简单起见,请查看以下代码:
class MyClass
{
public List<string> items = new List<string>();
public IEnumerator<string> GetEnumerator()
{
return items.GetEnumerator();
}
}
class MyComplexClass
{
private MyClass _itemlist /*= new MyClass()*/;
public MyClass itemlist
{
get { return _itemlist; }
set { _itemlist = value; }
}
}
void Sandbox()
{
MyClass mc /*= new MyClass()*/;
foreach (string Sb in mc.items)
{
string x = Sb;
}
MyComplexClass mcc = new MyComplexClass();
foreach (string Mb in mcc.itemlist) // <--- NullReferenceException
{
string x = Mb;
}
return;
}
有趣的是,C# 似乎可以保护您免受许多错误的错误。如果您不取消注释中的初始化,此代码将不会构建Sandbox()
,因此第一个foreach
不会得到NullReferenceException
.
但是,您最好取消注释 initMyComplexClass
以避免第二个中的异常foreach
。C# 将在有和没有这个初始化的情况下构建。
所以事实证明,在我的真实代码中,我只需要在 G_Locate 的类定义中添加一个简单的初始化。
现在唯一的问题是我一直想用上面的代码来简化上面的代码,{get; set;}
但是用所描述的初始化是不可能的。我将不得不忍受这个小问题。
事实上,在对象类型属性上,您并不需要 setter。
最后,我意识到我找不到适合我的问题的标题。到目前为止,我遇到的每一个问题都已经在这个论坛上得到了解答,我觉得我今天才发帖只是因为我找不到类似的帖子。也许有人可以想出标题和标签,使这个解决方案更容易找到。