Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在读取按钮C的标签时避免NRE_C#_Nullreferenceexception - Fatal编程技术网

C# 如何在读取按钮C的标签时避免NRE

C# 如何在读取按钮C的标签时避免NRE,c#,nullreferenceexception,C#,Nullreferenceexception,因沮丧而哭泣 在这种情况下,如何避免烦人的NRE?代码的输出是正确的,但我希望去掉NRE 背景: 表单上有一些按钮,其中一些代表教室的座位。其他按钮是不相关的,因为我只需要座椅按钮,并且只有座椅按钮具有具有值的标记 因此,我循环遍历所有按钮并读取它们的标签,如果它不是空的,则将该按钮保留在列表中。其余的都被忽略了 但是,当代码运行时,NRE会在第四行弹出,该行以try开头 foreach (Button seatbutton in this.Controls) { string bett

因沮丧而哭泣

在这种情况下,如何避免烦人的NRE?代码的输出是正确的,但我希望去掉NRE

背景:

表单上有一些按钮,其中一些代表教室的座位。其他按钮是不相关的,因为我只需要座椅按钮,并且只有座椅按钮具有具有值的标记

因此,我循环遍历所有按钮并读取它们的标签,如果它不是空的,则将该按钮保留在列表中。其余的都被忽略了

但是,当代码运行时,NRE会在第四行弹出,该行以try开头

foreach (Button seatbutton in this.Controls)
 {
   string betta;
   try { betta = seatbutton.Tag.ToString(); }
   catch { betta = ""; }

   if (!string.IsNullOrEmpty(betta))
    {
     seatbuttons.Add(seatbutton);
    }
 }
这是我的代码中这类NRE的最短、最直接的示例。还有几个

我在网上搜索过,大多数人的回答都是这样的:这是由不良的编码习惯造成的

正如你可能知道的,我对这整件事还很陌生,甚至还没有时间养成习惯。你们能帮忙吗?也许有一些关于良好编码习惯的建议

谢谢

在调用标记上的ToString方法之前,需要检查标记是否为null。大概是这样的:

string betta = seatbutton.Tag == null ? "" : seatbutton.Tag.ToString();
if (betta == "") {
  seatbuttons.Add(seatbutton);
}
如果您使用的是最新的VS/C,那么您也可以使用新的操作员:

string betta = seatbutton.Tag?.ToString();
if (!string.IsNullOrEmpty(betta)) {
  seatbuttons.Add(seatbutton);
}

@米基德:是的!我读了这篇文章,然后问:D。我确实理解searbutton.Tag有时是空的。但我不明白为什么不能将空值赋值给字符串变量。。。很明显,我可以,因为我在接球部分就是这么做的…:S@Momom0那不是你在做的。您首先对其调用ToString,但不能对null引用调用方法。为什么不能将该null值分配给字符串变量?当然可以,但不能尝试对其调用实例方法。这不是客观的cWow~太好了!谢谢以前从未见过这种语法,但它工作得非常完美。显然,我的其他NRE都是这个的产物。一旦你解决了这个问题,其他人都不见了!谢谢