当将IClass强制转换为Class时,我们应该检查NULL吗

本文关键字:我们 检查 NULL IClass 转换 Class 当将 | 更新日期: 2023-09-27 17:57:45

问题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的一般规则?

感谢

当将IClass强制转换为Class时,我们应该检查NULL吗

执行此操作时:

NewClass n = (NewClass) obj;

没有意义,因为如果它不进行强制转换,就会抛出一个无效的强制转换异常。

如果你对是否真的能投下它有任何疑问,你想做:

NewClass n = obj as NewClass;

然后

if(n != null) ...

您正在进行的强制转换称为直接强制转换,系统会认为它是可以进行的。n = obj as NewClass被称为间接强制转换,用于那些你想告诉程序"嘿,我认为这会奏效,但如果不行,不要抛出异常……如果不奏效,我会处理它。"

在铸造中使用isas

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

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

与相反

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

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

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

因此:

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

或者:

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

如果您想检查null,那么您应该执行

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

但一般来说,如果这在上下文中意味着什么,你可以检查null,并且你可以采取其他行动。在大多数情况下,您应该让它抛出NullReferenceException,而不是吞下它,这样您就可以更快地确定空引用的原因。

如果执行NewClass n = (NewClass)obj,如果未正确转换,则会引发异常。

如果您希望它有为null的可能性,而不抛出异常,则需要执行NewClass n = obj as NewClass;,然后检查n是否为null。

您可以通过使用is操作符来检查铸造是否能提前进行。if(obj is NewClass)

希望这能有所帮助。

如果需要参数,则应始终检查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"); 
}

我更喜欢在强制转换之前检查是否为null。例如

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

您遇到了很多问题。

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

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

  2. 一旦验证了该元素不为null,就可以检查是否可以执行强制转换。你基本上可以走两条路:

    Element Element=iElement作为Element;

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

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