2017-02-01 5 views
2

"式を投げる"のセクションを読んでいます。hereです。スロー式の明確化

「条件式、ヌル合体式、および一部のラムダ式」で使用できることが記載されています。

しかし条件付きと呼ばれるものを除いてそれぞれ明確な例はありませんでしたが、それはヌル合体だと思います。とにかく、それぞれ3つの例を挙げたいと思います。

条件式、ヌル合体式、およびラムダ式の式の例を正しく指定していますか?それとも、私は何かをミス・ラベル/ミックスしましたか?

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(); 
    } 
+4

あなたが正しいです。また、[SOのドキュメント](http://stackoverflow.com/documentation/c%23/1936/c-sharp-7-0-features/20215/throw-expressions#t=201702020703012064675)を参照するか、 afaik- [Microsoft doc](https://docs.microsoft.com/en-us/dotnet/articles/csharp/csharp-7#throw-expressions)C#7.0リリースに関連する – uTeisT

答えて

5

はい、ご理解ください。表現(??オペレータ)など表現として

  • ラムダ式を合体

    • 条件式(三元または?:オペレータ)
    • ヌル:C#7で、あなたが前にできなかったこれらの場所でthrowを使用することができます-bodiedメンバーは

    あなたがにリンクされている記事、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発現のための新たな用途のうちの2つを包み込む素晴らしい例では表現ボディsetアクセサです:

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