问题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?
谢谢
答案 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
并抛出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");
}
答案 5 :(得分:1)
我更倾向于在演员表之前检查null。例如。
if (obj == null)
{
throw new ArgumentNullException("obj", "The argument must has a value specified");
}
答案 6 :(得分:1)
你正在混淆问题。
您应始终验证公开方法的参数。因此,您首先应该这样做:
公共WhateEverMethod(IElement iElement) { if(iElement == null) { 抛出新的ArgumentNullException(...); } }
验证该元素不为null后,检查是否可以执行强制转换。你可以基本上采取两种方式:
元素元素= iElement作为元素;
if(element == null)//强制转换失败 { 抛出新的InvalidCastException(...); }
或
if (!(iElement is Element))
{
throw new InvalidCastException(...);
}
Element element = (Element)iElement;