我们应该在将IClass转换为Class时检查NULL吗?

时间:2011-05-27 14:35:15

标签: c#

问题1>在下列情况下我应该检查NULL吗?

public interface INewClass {}
public class NewClass : INewClass {}

public void FunMeA(INewClass obj)
{
    NewClass n = (NewClass) obj;
    ... // Should I check (n == null) here?
    // call methods defined inside INewClass (updated from NewClass to INewClass)
    ...
}

A concrete example,

public void FunMeB(IAsyncResult itfAR)
{
    AsyncResult ar = (AsyncResult) itfAR;
    ... // Should I check (ar == null) here?
    // access ar.AsyncDelegate
    ...
}

问题2>我刚开始从C ++转移到C#。 在C ++中编码时,我知道何时应该进行检查。 但是,我完全迷失在C#世界。所以问题是:是否存在 一般规则可以告诉我何时必须检查NULL?

谢谢

7 个答案:

答案 0 :(得分:12)

这样做时:

NewClass n = (NewClass) obj;

没有意义,因为如果它没有强制转换,则会抛出无效的强制转换异常。

如果您对是否可以实际施放它有任何疑问,您可以这样做:

NewClass n = obj as NewClass;

然后

if(n != null) ...

你正在做的演员被称为直接演员,系统会认为它可以制作。 n = obj as NewClass被称为间接演员,适用于那些你想告诉节目的场景“嘿,我认为这会起作用,但如果不是不要翻出并抛出异常...我将处理如果它不起作用的话。“

在投射中使用is vs as

根据您希望的情况,一个会比另一个好。从性能角度来看,技术上as是首选。 .Net将使用原子方式尝试强制转换为所需类型,如果不是,则返回null,在is的情况下,它必须遍历继承树两次以查看它是否与该类型匹配然后再投射它。因此,在大多数情况下,如果您想要查看是否要转换并使用该类型,最好:

var obj = o as type
if (obj != null)

而不是

if(o is type)
{
   var obj = (type); 
}

答案 1 :(得分:5)

如果强制转换失败,您的代码将抛出异常。

使用is运算符来查看强制转换是否有效,并as进行强制转换(如果强制转换失败,则不会抛出并返回null)。

所以:

if(obj is NewClass)
{
  //Yay, can cast!
}

或者:

NewClass nc = obj as NewClass;
if(nc != null)
{
  //Yay!
}

答案 2 :(得分:2)

如果你想检查null,你应该做

NewClass n = obj as NewClass ;
if (n != null)
{

...

}

但一般情况下,如果在上下文中表示某些内容并且您可以采取其他操作,则可以检查null。在大多数情况下,你应该让它抛出NullReferenceException而不是吞下它,这样你就可以更快地识别出空引用的原因。

答案 3 :(得分:2)

如果你执行NewClass n = (NewClass)obj,如果它没有正确投射,你将会抛出异常。

如果你希望它有可能为空,而不抛出异常,你需要NewClass n = obj as NewClass;,然后检查n是否为空。

您可以使用is运算符检查演员阵容是否可以预先运行。 if(obj is NewClass)

希望这有帮助。

答案 4 :(得分:2)

如果需要参数,则应始终检查null并抛出ArgumentExceptionArugmentNullException

此参数检查的最佳方法是:

AsyncResult ar = itfAR as AsyncResult;
if(ar == null)
{
    // even better: Use a resource here
    throw new ArgumentNullException("Parameter itfAR must not be null and must be of type AsyncResult"); 
}

答案 5 :(得分:1)

我更倾向于在演员表之前检查null。例如。

if (obj == null) 
{
  throw new ArgumentNullException("obj", "The argument must has a value specified");
}

答案 6 :(得分:1)

你正在混淆问题。

  1. 您应始终验证公开方法的参数。因此,您首先应该这样做:

    公共WhateEverMethod(IElement iElement) {      if(iElement == null)      {          抛出新的ArgumentNullException(...);      } }

  2. 验证该元素不为null后,检查是否可以执行强制转换。你可以基本上采取两种方式:

    元素元素= iElement作为元素;

    if(element == null)//强制转换失败 {    抛出新的InvalidCastException(...); }

  3. if (!(iElement is Element))
    {
        throw new InvalidCastException(...);
    }
    
    Element element = (Element)iElement;