2016-04-27 4 views
4

まず、私はこの質問に使用されるタイトルについて謝ります。私はそれを尋ねる方法や検索する方法さえ知らないので、どこかに、このような質問があるかもしれません。C#6.0の新しい構文/新しいnullチェック構文の違い?


私は最近、私が前に見たことがないのVisual Studio 2015の潜在的な修正時に困惑します。 EventHandlersを構築するとき、私は通常、このような何か:

public event EventHandler MyEvent; 

internal void onMyEvent(EventArgs eventArgs) { 
    if(MyEvent != null) { 
     MyEvent(this, eventArgs); 
    } 
} 

しかし、今、Visual Studioの2015のif声明アウトグレーと対応する括弧をして、ホバリング時に、デリゲート呼び出しがを簡素化することができるというメッセージが表示されます。簡略版は次のようになります。

public event EventHandler MyEvent; 

internal void onMyEvent(EventArgs eventArgs) { 
    MyEvent?.Invoke(this, eventArgs); 
} 

これはどういう仕組みですか?メソッドnullまたはコードが呼び出されてExceptionがスローされない場合は、の前の式が実行されるとが実行されますか? 'はnullですか?

また、変数/メソッド/メソッドが ''のnullであるかどうかを確認する文をすべて置き換えることができますか? '、コードの可読性を脇に置いていますか?


サイドノート:私はそれを前に見たことがないので、私は、6.0、これは、C#の新しいバージョンからであると仮定しています。私が間違っている場合は私を修正してください。

+1

それは新しい構文です:https://msdn.microsoft.com/en-us/library/dn986595。 aspx –

+0

そしてそれはNull条件演算子 – rbm

+0

と呼ばれています。あなたの助けに感謝@allan。この質問の回答を今投稿します。 – auhmaan

答えて

11

このC#6の機能は、Null-conditional Operatorsと呼ばれています。

またILSpyで生成されたC#コードに探しworthsです:あなたは、これは純粋なコンパイラの機能で見たよう

internal void onMyEvent(EventArgs eventArgs) 
{ 
    EventHandler expr_07 = this.MyEvent; 
    if (expr_07 != null) 
    { 
     expr_07(this, eventArgs); 
    } 
} 

...それだけで、従来のヌルチェックするようにコードを書き換えます。あなたに答えるために

は(私はあなたが既にコードを見て、これを考え出したと思いますが)質問:

は例外がヌル やコードのうち、メソッドを呼び出すことに起因するスローされることはないでしょう式の前に '?'無効である?

イベントハンドラがnullの場合、例外はスローされません。コードは、オブジェクトが?の前に実行されません。無効である。

ここまでは、これはメソッド呼び出しでしかありませんでした。明らかに、Null条件付き演算子を持つ式の結果である値を割り当てる場合は、少し複雑です。参照型の場合は変数はnullのままですが、値型の場合はそれは自動的にnullableであり、あなたが '?'を使用するオブジェクトであればnullになります。演算子はnullです。ここで

は、この場合のデコンパイルされたコードである:それはシンプルな作り

Program.Customer[] array = new Program.Customer[10]; 
    if (array == null) 
    { 
     int? arg_33_0 = null; 
    } 
    else 
    { 
     Program.Customer expr_1A = array[0]; 
     if (expr_1A == null) 
     { 
      int? arg_33_0 = null; 
     } 
     else 
     { 
      new int?(expr_1A.IntField); 
     } 
    } 
+0

どうすれば 'MyEvent?(this、eventArgs);'機能セットの中で ''それが ''ヌル ''でなかった場合、私の開発者の経験で 'WouldBeNice()'を呼び出すでしょう:) – toddmo

+0

@toddmo面白い点!私はそれが条件演算子に干渉するだろうと思う。 '?'の前に '?'がないと、コンパイラはboolを期待してから条件演算子を評価します。このコードを見てください: bool b = Decide(); int intVal = b?(1):2; (あなたはあなたのスニペットのパターンを見ます: '変数?(') 私は言語の専門家ではありませんが、C#チームの誰かがこれに答えることができますが、これがあなたに「?そのケース。 – gregkalapos

+0

'MyEvent.?(this、eventArgs);' - メソッド名がない場合は、デフォルトのメソッド名を使用してください。?。?lol idkでも、それを見るのは紛らわしいことではありません。 ) – toddmo

2

...

MyEvent?.Invoke(this, eventArgs);に変更しました。これはNull Conditional Operatorと呼ばれ、コードを簡略化するために使用されています。

メソッドを呼び出したり、列挙型のインデックスにアクセスする前にnullをテストするために使用されます(ArrayまたはListなど)。

この例では、ヌル条件演算子についてのページにあり、それは一目瞭然です:

// null if customers is null 
int? length = customers?.Length; 

// null if customers is null 
Customer first = customers?[0]; 

// null if customers, the first customer, or Orders is null 
int? count = customers?[0]?.Orders?.Count(); 
関連する問題