サーチ…


構文

  • 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チェックのドキュメントを参照してください。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow