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

Ed *_* S. 4 c#

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

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

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

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

Mic*_*lGG 7

如果要在传入非Button时崩溃,请执行以下操作:

var button = (Button)sender;
Run Code Online (Sandbox Code Playgroud)

请注意,如果传入了null对象,它仍然可以为null.


Edw*_*vis 6

这取决于您的代码合同.

如果您确定不是null,则无需检查.您可以引入一个断言来仅检查调试模式.我通常只检查过null,好像我之前没有检查过,否则我相信我的合同,有时候我会使用断言.

var button = sender is Button ? sender as Button 
             : throw new Exception("Not a button");
Run Code Online (Sandbox Code Playgroud)

如果你想要一个与坏演员不同的异常,你可以试试这样的东西.同样,正式的代码合同会更好.看看这个图书馆.