澄清投掷表达式

时间:2017-02-01 23:28:18

标签: c# .net c#-7.0

我正在阅读关于“投掷表达”here的部分。

它提到你现在可以在“...条件表达式,空合并表达式和一些lambda表达式上使用它们。”

但他们没有为每个人提供明确的例子,除了他们称之为有条件的一个,但我认为它是空的合并。无论如何,我想为每三个人提供一个例子。

这些(在我的注释中)是否正确命名了条件表达式,空合并表达式和lambda表达式的throw表达式示例?或者我错误标记/混淆了什么?

    public class Person
    {
        public string Name { get; }

        // null coalescing expression.
        public Person(string name) => Name = name ?? throw new ArgumentNullException(name);

        // conditional expressions
        public string GetFirstName()
        {
            var parts = Name.Split(new string[] { " " }, StringSplitOptions.None);
            return (parts.Length > 0) ? parts[0] : throw new InvalidOperationException("No name!");
        }
        // Lambda
        public string GetLastName() => throw new NotImplementedException();
    }

1 个答案:

答案 0 :(得分:5)

是的,您的理解是正确的。在C#7中,您可以在以前无法使用的地方使用throw

  • 条件表达式(三元或?:运算符)
  • 空合并表达式(??运算符)
  • Lambda表达式,例如表达式身体成员

如您链接的文章中所述,throw一直是C#中的语句(不是表达式),这意味着您无法使用它:

var theValue = myNullable.HasValue
    ? myNullable.Value
    : throw new ArgumentNullException();

相反,您需要拆分赋值语句:

var theValue = myNullable.HasValue ? myNullable.Value : null;
if (theValue == null) throw new ArgumentNullException();

当然,这是一个愚蠢的例子,但它演示了如何能够像条件运算符一样抛出内部结构。

包装throw表达式的两个新用法的一个很好的例子是表达式set访问者:

public string Name
{
    get => name;
    set => name = value ?? throw new ArgumentNullException();
}