我*总是*必须在安全演员后检查是否为空?

时间:2009-02-12 00:46:19

标签: c#

快速提问;执行安全演员后,我是否总是需要检查空值?我现在这样做,但在这种情况下:

void button1_Click(object sender, EventArgs e)
{
    Button = sender as Button;
    if (button != null)  // <-- necessary?
    {
        // do stuff with 'button'
    }
}

我只是想知道我是不是在想什么。我每次出于习惯都会检查null,但是在这种情况下,我认为如果非Button对象连接到应该只用于按钮的处理程序,我宁愿崩溃。

编辑:好的,谢谢你们。如果有一个我失踪的角度,我只是好奇。

6 个答案:

答案 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的类型(不需要手动检查),因为这样你就可以更快地找到错误的原因。