2009-02-12 45 views
4

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

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

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

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

回答

2

我同意 - 也许你最好在应用程序崩溃时关闭非按钮,因为此处理程序只适用于按钮。使用正常转换进行转换甚至可能比“as”转换更好,因为最终会出现InvalidCastException而不是NullReferenceException,这会使问题非常明显。

2

是的。除非你想,如果你在这个按钮:)

+0

这是一个比其他任何事情都更好的例子,但似乎没有一个我错过的潜在问题。 – 2009-02-12 00:56:26

7

如果你想崩溃,如果非按钮被通过了,做打电话的东西会导致异常:

var button = (Button)sender; 

注意,它可能仍然是空,如果传入一个空对象。

2

只有当你想避免可能的NullRefernceExcetion时才有必要。

6

这将取决于您的代码合同。

如果你知道肯定不是null,则不需要检查。您可以引入一个断言来仅检查调试模式。我通常只在一次之后检查null,就好像我之前没有检查过一样,否则我相信我的合同,有时我会使用assert。

var button = sender is Button ? sender as Button 
      : throw new Exception("Not a button"); 

如果您想要一个不同于坏转换的异常,您可以尝试类似这样的操作。再一次,正式的代码合同会更好。检查出this库。

1

答案在您提到“安全演员”时出现问题。如果这意味着什么,这意味着演员将取得成功。

在这种情况下,最好使用抛出的类型而不是返回null的类型(无需手动检查),因为这样可以更快地找到错误的原因。