快速提问;执行安全演员后,我是否总是需要检查空值?我现在这样做,但在这种情况下:
void button1_Click(object sender, EventArgs e)
{
Button = sender as Button;
if (button != null) // <-- necessary?
{
// do stuff with 'button'
}
}
我只是想知道我是不是在想什么。我每次出于习惯都会检查null,但是在这种情况下,我认为如果非Button对象连接到应该只用于按钮的处理程序,我宁愿崩溃。
编辑:好的,谢谢你们。如果有一个我失踪的角度,我只是好奇。答案 0 :(得分:7)
如果要在传入非Button时崩溃,请执行:
var button = (Button)sender;
请注意,如果传入了null对象,它仍然可以为null。
答案 1 :(得分:6)
这取决于您的代码合同。
如果您确定不是null,则无需检查。您可以引入一个断言来仅检查调试模式。我通常只检查过null,好像我之前没有检查过,否则我相信我的合同,有时候我会使用断言。
var button = sender is Button ? sender as Button
: throw new Exception("Not a button");
如果你想要一个与坏演员不同的异常,你可以尝试这样的事情。同样,正式的代码合同会更好。查看this库。
答案 2 :(得分:2)
是。如果您在此按钮上调用某些内容,则需要引发异常:)
答案 3 :(得分:2)
只有在您想要避免可能的NullRefernceExcetion
时才有必要。
答案 4 :(得分:2)
我同意 - 如果连接非Button,你可能最好让应用程序崩溃,因为这个处理程序只对Buttons有意义。使用普通的强制转换甚至可能比“as”强制转换更好,因为你最终会得到InvalidCastException而不是NullReferenceException,这会使问题变得非常明显。
答案 5 :(得分:1)
当您提到“安全演员”时,答案就在于问题。如果这意味着什么,那就意味着演员阵容将会成功。
在这种情况下,最好使用抛出的类型而不是返回null的类型(不需要手动检查),因为这样你就可以更快地找到错误的原因。