当将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的一般规则?
感谢
执行此操作时:
NewClass n = (NewClass) obj;
没有意义,因为如果它不进行强制转换,就会抛出一个无效的强制转换异常。
如果你对是否真的能投下它有任何疑问,你想做:
NewClass n = obj as NewClass;
然后
if(n != null) ...
您正在进行的强制转换称为直接强制转换,系统会认为它是可以进行的。n = obj as NewClass
被称为间接强制转换,用于那些你想告诉程序"嘿,我认为这会奏效,但如果不行,不要抛出异常……如果不奏效,我会处理它。"
在铸造中使用is
与as
。
根据你想要的场景,其中一个会比另一个更好。从性能角度来看,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
并抛出ArgumentException
或ArugmentNullException
。
在这里进行此参数检查的最佳方法是:
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");
}
您遇到了很多问题。
-
您应该始终验证公开方法的参数。因此,你必须首先做:
公共WhateEverMethod(IElement-IElement){if(iElement==null){抛出新的ArgumentNullException(…);}}
-
一旦验证了该元素不为null,就可以检查是否可以执行强制转换。你基本上可以走两条路:
Element Element=iElement作为Element;
if(element==null)//强制转换失败{抛出新的InvalidCastException(…);}
或
if (!(iElement is Element))
{
throw new InvalidCastException(...);
}
Element element = (Element)iElement;