VS2015プレビューのC#6.0では、?.
という新しい演算子があります。これは、次のように使用できます。
public class A {
string PropertyOfA { get; set; }
}
...
var a = new A();
var foo = "bar";
if(a?.PropertyOfA != foo) {
//somecode
}
それは正確に何をしますか?
null条件付き 演算子です。基本的には
「最初のオペランドを評価します。それがnullの場合は、nullの結果で停止します。それ以外の場合は、(最初のオペランドのメンバアクセスとして)2番目のオペランドを評価します。
あなたの例では、a
がnull
であれば、a?.PropertyOfA
は例外を投げるのではなくnull
と評価されます - それからnull
参照をfoo
と比較して(文字列の==
オーバーロードを使って) if
ステートメントの本文に入ります。
言い換えれば、それはこのようなものです:
string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
...
}
ただし、a
は1回だけ評価されます。
これによって式の型も変わる可能性があることに注意してください。たとえば、 FileInfo.Length
を検討してください。これはlong
型のプロパティですが、null条件演算子と共に使用すると、long?
型の式になります。
FileInfo fi = ...; // fi could be null
long? length = fi?.Length; // If fi is null, length will be null
階層を平らにしたりオブジェクトをマッピングしたりするときにとても便利です。の代わりに:
if (Model.Model2 == null
|| Model.Model2.Model3 == null
|| Model.Model2.Model3.Model4 == null
|| Model.Model2.Model3.Model4.Name == null)
{
mapped.Name = "N/A"
}
else
{
mapped.Name = Model.Model2.Model3.Model4.Name;
}
それは(上記と同じ論理)のように書くことができます
mapped.Name = Model.Model2?.Model3?.Model4?.Name ?? "N/A";
( ??またはNULL合体演算子 は、 ?またはNULL条件演算子 とは異なります。).
Actionを使って代入演算子の外側で使うこともできます。の代わりに
Action<TValue> myAction = null;
if (myAction != null)
{
myAction(TValue);
}
次のように単純化できます。
myAction?.Invoke(TValue);
システムを使用します。
public class Program
{
public static void Main()
{
Action<string> consoleWrite = null;
consoleWrite?.Invoke("Test 1");
consoleWrite = (s) => Console.WriteLine(s);
consoleWrite?.Invoke("Test 2");
}
}
結果:
テスト2
これはC#では比較的新しく、メソッドチェーンで nullまたはnon-null の値に関して関数を呼び出すのが簡単になるためです。
同じことを達成するための古い方法は次のとおりです。
var functionCaller = this.member;
if (functionCaller!= null)
functionCaller.someFunction(var someParam);
そして今ではそれだけではるかに簡単になりました:
member?.someFunction(var someParam);
ここで読むことを強くお勧めします。