【问题标题】:C#7 Pattern Matching value Is Not NullC#7 模式匹配值不为空
【发布时间】:2018-09-23 04:48:18
【问题描述】:

我想获取一个可枚举的第一个实例,然后在找到的实例上执行一些操作(如果它存在)(!= null)。有没有办法通过 C#7 模式匹配来简化这种访问?

采取以下出发点:

IEnumerable<Client> clients; /// = new List<Client> {new Client()};
Client myClient = clients.FirstOrDefault();
if (myClient != null)
{
    // do something with myClient
}

我可以将FirstOrDefault 的调用与if statement 结合起来吗:

if (clients.FirstOrDefault() is null myClient)
{
    // do something with myClient
}

我在MSDN Pattern Matchingelsewhere on Stack Overflow 上没有看到任何类似的例子

【问题讨论】:

    标签: c# pattern-matching c#-7.0


    【解决方案1】:

    你绝对可以做到。我的示例使用了string,但它与Client 的工作方式相同。

    void Main()
    {
        IList<string> list = new List<string>();
    
        if (list.FirstOrDefault() is string s1) 
        {
            Console.WriteLine("This won't print as the result is null, " +
                              "which doesn't match string");
        }
    
        list.Add("Hi!");
    
        if (list.FirstOrDefault() is string s2)
        {
            Console.WriteLine("This will print as the result is a string: " + s2);
        }
    }
    

    【讨论】:

    • 啊……当然了。如果它是not null,您可以用肯定的条件测试它实际上是什么。谢谢!
    • 确保列表声明为varIList&lt;string&gt;,因为list.Add 类型为IEnumerable&lt;string&gt; 时将不起作用
    • 该死!我最初发布(并实际测试过)的代码确实有它作为列表。然后我改变了它,因为他使用了 IEnumerable,我想尽可能地与他的代码保持一致,让他更清楚。感谢您指出这一点:-)
    • 问题是针对 C#7.0 的。 C#8.0 引入了额外的模式。由于值被强类型化为string,我们不需要测试类型。我们可以使用空属性模式来进行测试。 list.FirstOrDefault() is { } s1。因为,要使属性模式成功,对象必须不为空,并且我们不实际测试任何属性,{ } 在这里等同于!= null
    【解决方案2】:

    您可能会使用以下 null 传播方法作为 RB 答案的替代方法。

    var client = clients.FirstOrDefault();
    var implement = client?.PerformImplementation();
    

    尽管语法正在尝试使用代码,但这将自动执行空值检查。一个很好的语法糖,浓缩了代码并且仍然相当有表现力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      相关资源
      最近更新 更多