繁体   English   中英

C#中最短的空检查

[英]Shortest null check in c#

有没有更短的方法在c# 中写这个:

if(myobject!=null){

}

JavaScript 中,我们可以这样做:

if(myobject){

}

免责声明:我知道这在 JavaScript 中也会匹配 'true'。 这只会用于应该是特定类型对象的变量。

我发现了一些类似的问题,但他们提出的问题略有不同:

C# 检查空值的最短方法,如果不是,则分配另一个值

检查对象是否为空的最佳和最快的方法

如何确定变量是“未定义”还是“空”?

您可以通过operator在 C# 中获得相同的语法

  public class MyClass {
    ...
    // True if instance is not null, false otherwise
    public static implicit operator Boolean(MyClass value) {
      return !Object.ReferenceEquals(null, value);  
    }   
  }


....

  MyClass myobject = new MyClass();
  ...
  if (myobject) { // <- Same as in JavaScript
    ...
  }

C# 语言哲学与 JavaScript 完全不同。 C# 通常会强制您对某些事情更加明确,以防止一些常见的编程错误(我相信这也有助于简化编译器设计和测试)。

如果 C# 允许这种隐式转换为布尔值,那么您很可能会遇到这样的编程错误:

if(myobject = otherObject)
{
   ...
}

您在其中进行了分配而不是平等检查 通常 C# 会防止此类错误(因此,尽管 Dmitry 的回答很聪明,但我建议不要这样做)。

用过的 ?? 运算符https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operator

 var myobject = notNullValue ?? nullValue;

很抱歉使用答案而不是评论。 我还没有足够的声誉发表评论。

我只是想知道,现在几年之后,Dmitry Bychenko的回答是否仍然准确? 我的搜索没有发现任何更近期的文章或问题,但它看起来像是一个简单的东西

if (value)  // like JavaScript
    ... do thing

现在会存在于C#......

如果你想抛出一个ArgumentNullException例如检查方法参数,有一个方便的单行代码来做到这一点:

_ = x ?? throw new ArgumentNullException(nameof(x));

在这里,我们尝试将参数分配给丢弃_运算符。 ?? -operator 执行空检查。 如果变量为空,则抛出异常。

在 Visual Studio 中,您可以添加自定义代码段以将此行绑定到快捷方式arg0 您只需要输入arg0 ,双击 TAB 键,然后输入参数名称。 实现空检查只需要 2 秒。

这是片段。 要将其导入 Visual Studio,请使用本指南: https : //docs.microsoft.com/de-de/visualstudio/ide/walkthrough-creating-a-code-snippet?view=vs-2019

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
    <Header>
        <Title>Argument null check for parameters</Title>
        <Shortcut>arg0</Shortcut>
    </Header>
    <Snippet>
        <Code Language="CSharp">
            <![CDATA[_= $param$ ?? throw new ArgumentNullException(nameof($param$));]]>
        </Code>
        <Declarations>
            <Literal>
                <ID>param</ID>
                <ToolTip>Name of the parameter.</ToolTip>
                <Default>x</Default>
            </Literal>
        </Declarations>
    </Snippet>
</CodeSnippet>

您可以使用对象类静态方法 ReferenceEquals 方法来确定引用是否为空

  MyClass1 obj = new MyClass1();
        if (object.ReferenceEquals(obj,null))
        {
            Console.Write("obj ref is null");
        }

暂无
暂无

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

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