创建对象后检查是否为空

6
我正在创建一个新对象。
myobject t = new myobject();

如果new成功了,我应该检查下一行是否为null引用吗?

if (null != t)

我可以确定这个对象一定会与null不同...

谢谢。

5个回答

11
根据C#文档,如果new无法成功分配新对象实例的空间,则会引发OutOfMemoryException。因此,无需对null进行显式检查。
如果您想检测new未能分配新对象的情况,可以尝试执行以下操作:
try {
    myobject t = new myobject();
    //do stuff with 't'
}
catch (OutOfMemoryException e) {
    //handle the error (careful, you've run out of heap space!)
}

除非这是不真实的;请查看我的答案以获取反例。 - Marc Gravell
1
但是在你的反例中,你承认“在任何合理的代码中,new()永远不会返回null”。几乎总会有一些晦涩和深奥的情况允许规则被任意颠覆(例如,也许有人制作了一个自定义的.NET运行时,为了好玩而随机返回null)。但那不是明智的选择,在任何合理的情况下都能保持正确的答案对我来说已经足够好了。 - aroth
也许吧,但这是在常规.NET框架中运行的,没有特殊的黑客、插件、库、配置等。 - Marc Gravell
2
请注意,在较新版本的CLR中,您实际上无法处理OOMException。您可以处理它,但它会自动重新抛出。这基本上是一个致命的异常。 - Eric Lippert

11

这实际上取决于你需要保护自己免受病态愚蠢的代码的程度;p 下面这个 (应用于类) 的 new() 将会返回null:

MyFunnyType obj = new MyFunnyType();

使用:

class MyFunnyProxyAttribute : System.Runtime.Remoting.Proxies.ProxyAttribute {
   public override MarshalByRefObject CreateInstance(Type serverType) {
      return null;
   }
}
[MyFunnyProxy]
class MyFunnyType : ContextBoundObject { }

幸运的是,你需要跑得很远才能遇到这种疯狂的情况。在任何“理智”的代码中,new() 永远不会返回 null(除了 Nullable<T>)。这两种反例在此处有更详细的讨论。

但要再次强调:如果没有理由怀疑某人真的很傻,就不要检查结果是否为 null


@BoltClock - 嗯,总得有人来做吧 ;p - Marc Gravell

3
new运算符用于为一个类的新实例分配内存。使用new进行实例化在“正常”情况下(参见Marc的答案以获取边缘情况)永远不会导致null,假设内存成功分配。
如果对象创建失败,因为其构造函数抛出异常或无法分配内存,则该语句后面的代码将不会执行。因此,即使对象为null并且您尝试检查,检查也不会发生。相反,您将使用try-catch块处理异常。

这个有反例...请看我的答案。 - Marc Gravell

1

不,检查这个没有意义。


2
如果您必须检查对象的属性以确定是否可以对其进行操作,我认为这是一种代码异味。您有一个构造函数可以生成不可用状态的对象。 - R. Martinho Fernandes

0

跳过空值检查 - 唯一不创建对象的情况是构造函数中出现异常。


1
不,那不是“唯一”的情况;请查看我的回答以获取更多信息。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接