C# Language
ヌル条件付き演算子
サーチ…
構文
- X?Y; // Xがnullの場合はnull else XY
- X?Y?Z; // XがnullまたはYがnullの場合はnull else XYZ
- X?[index]; // Xがnullの場合はnull else X [index]
- X?.ValueMethod(); // Xがnullの場合はnull else X.ValueMethod()の結果;
- X?.VoidMethod(); // Xがnullの場合は何もしませんelse call X.VoidMethod();
備考
値タイプT
ヌル合体演算子を使用する場合は、 Nullable<T>
返すことに注意してください。
Null条件付き演算子
?.
演算子は冗長なヌルチェックを避けるために構文上の砂糖です。 セーフナビゲーションオペレータとしても知られています。
次の例で使用されるクラス:
public class Person
{
public int Age { get; set; }
public string Name { get; set; }
public Person Spouse { get; set; }
}
オブジェクトがnullの可能性がある場合(参照型を返す関数など)、 NullReferenceException
が発生しないようにオブジェクトをまずチェックする必要があります。 null条件付き演算子がなければ、次のようになります。
Person person = GetPerson();
int? age = null;
if (person != null)
age = person.Age;
null-conditional演算子を使用した同じ例:
Person person = GetPerson();
var age = person?.Age; // 'age' will be of type 'int?', even if 'person' is not null
オペレータの連鎖
null-conditional演算子は、オブジェクトのメンバーとサブメンバーで結合できます。
// Will be null if either `person` or `person.Spouse` are null
int? spouseAge = person?.Spouse?.Age;
NULL結合演算子との結合
null-conditional演算子は、 NULL合体演算子と組み合わせて、デフォルト値を提供することができます。
// spouseDisplayName will be "N/A" if person, Spouse, or Name is null
var spouseDisplayName = person?.Spouse?.Name ?? "N/A";
ヌル条件索引
?.
同様に?.
NULL条件付き索引演算子は、NULLになる可能性のあるコレクションに索引付けするときに、NULL値を検査します。
string item = collection?[index];
の構文上の砂糖
string item = null;
if(collection != null)
{
item = collection[index];
}
NullReferenceExceptionsを避ける
var person = new Person
{
Address = null;
};
var city = person.Address.City; //throws a NullReferenceException
var nullableCity = person.Address?.City; //returns the value of null
この効果は連鎖することができます:
var person = new Person
{
Address = new Address
{
State = new State
{
Country = null
}
}
};
// this will always return a value of at least "null" to be stored instead
// of throwing a NullReferenceException
var countryName = person?.Address?.State?.Country?.Name;
ヌル条件演算子は拡張メソッドで使用できます
拡張メソッドはnull参照でも動作しますが、 ?.
を使用でき?.
とにかくヌルチェックする。
public class Person
{
public string Name {get; set;}
}
public static class PersonExtensions
{
public static int GetNameLength(this Person person)
{
return person == null ? -1 : person.Name.Length;
}
}
通常、このメソッドはnull
参照に対してトリガされ、-1を返しnull
。
Person person = null;
int nameLength = person.GetNameLength(); // returns -1
?.
を使用してい?.
このメソッドはnull
参照に対してトリガされず、 型はint?
:
Person person = null;
int? nameLength = person?.GetNameLength(); // nameLength is null.
この動作は、実際には?.
演算子が動作する: NullReferenceExceptions
を避けるために、nullインスタンスのインスタンスメソッド呼び出しを避ける。ただし、メソッドが宣言される方法の違いにもかかわらず、同じロジックが拡張メソッドに適用されます。
最初の例で拡張メソッドが呼び出される理由の詳細については、 拡張メソッド - nullチェックのドキュメントを参照してください。