繁体   English   中英

如何在C#中检测空引用?

[英]How do I detect a null reference in C#?

如何在C#中确定对象引用是否为空?如果它为null,则抛出异常?

即如果我传入了类引用,我不知道它是否为null。

对null进行测试永远不会*抛出异常

void DoSomething( MyClass value )
{
    if( value != null )
    {
        value.Method();
    }
}

*绝不应该永远 正如@Ilya Ryzhenkov指出的那样,MyClass的!=运算符的错误实现可能会引发异常。 幸运的是,Greg Beech有一篇关于在.NET中实现对象相等性的博文。

Robert说的是什么,但是对于那个特例,我喜欢用这样的保护子句表达它,而不是将整个方法体嵌套在if块中:

void DoSomething( MyClass value )
{
    if ( value == null ) return;
    // I might throw an ArgumentNullException here, instead

    value.Method();
}

注意,在MyClass上定义运算符!=可能会导致检查结果不同,以及稍后会发生NullReferenceException。 要绝对确定,请使用object.ReferenceEquals(value,null)

if(p != null)
{
   DoWork(p);
}

此外,如果您想要检测某个类是否属于正确类型并且一次性使用它,那么'as'关键字会很有用。

IExample e = p as IExample;
if(e != null)
    DoWork(e);

在上面的例子中,如果你要像e(IExample)那样投射e,如果e没有实现IExapmle,它将抛出异常。 如果你使用'as'而e没有实现IExample e将只是null。

如果查看大多数.NET框架源代码,您会看到他们将这样的检查放在其函数的顶部。

public void DoSomething(Object myParam)
{
  if (myParam == null) throw new ArgumentNullException("myParam");

  // Carry on
}

使用C#6.0,这更加优雅; 你可以在一行中做到:-)

value?.Method();

如果“value”为null,则不会发生任何事情 - 也不例外。

这是挑剔,但我总是把它们编码为......

if (null == obj) {
   obj = new Obj();
}

代替

if (obj == null) {
   obj = new Obj();
}

避免意外写作

if (obj = null) {
   obj = new Obj();
}

因为

if (null = obj) {
   obj = new Obj();
}

会给你一个编译错误

(YourObject != Null)

你可以比较null吗?

如果它为null而不是抛出异常,则可以初始化对象。 您可以使用Null Pattern。

或者,如果您使用值类型,则可以阅读有关可空类型的内容: http//www.c-sharpcorner.com/UploadFile/mosessaur/nullabletypes08222006164135PM/nullabletypes.aspx

我在应用程序的xaml.cs应用程序派生定义中:

private SortedList myList;

我希望能够重用我的构造函数。 所以我需要:

if ( myList == null)
   myList = new SortedList();

谢谢罗伯特!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM