web-dev-qa-db-ja.com

疑問符とドット演算子とは何ですか?C#6.0で意味は?

VS2015プレビューのC#6.0では、?.という新しい演算子があります。これは、次のように使用できます。

public class A {
   string PropertyOfA { get; set; }
}

...

var a = new A();
var foo = "bar";
if(a?.PropertyOfA != foo) {
   //somecode
}

それは正確に何をしますか?

265
Landeeyo

null条件付き 演算子です。基本的には

「最初のオペランドを評価します。それがnullの場合は、nullの結果で停止します。それ以外の場合は、(最初​​のオペランドのメンバアクセスとして)2番目のオペランドを評価します。

あなたの例では、anullであれば、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
373
Jon Skeet

階層を平らにしたりオブジェクトをマッピングしたりするときにとても便利です。の代わりに:

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";

DotNetFiddle.Net作業例

??またはNULL合体演算子 は、 ?またはNULL条件演算子 とは異なります。).

Actionを使って代入演算子の外側で使うこともできます。の代わりに

Action<TValue> myAction = null;

if (myAction != null)
{
  myAction(TValue);
}

次のように単純化できます。

myAction?.Invoke(TValue);

DotNetFiddleの例

システムを使用します。

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

60
Erik Philips

これはC#では比較的新しく、メソッドチェーンで nullまたはnon-null の値に関して関数を呼び出すのが簡単になるためです。

同じことを達成するための古い方法は次のとおりです。

var functionCaller = this.member;
if (functionCaller!= null)
    functionCaller.someFunction(var someParam);

そして今ではそれだけではるかに簡単になりました:

member?.someFunction(var someParam);

ここで読むことを強くお勧めします。

https://docs.Microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/null-conditional-operators

2
Zeeshan Adil