수색…


통사론

  • 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 X.ValueMethod ()의 결과;
  • X? .VoidMethod (); // X가 null이면 아무것도하지 않습니다. else call X.VoidMethod ();

비고

값 유형 T 에 널 통합 연산자를 사용하면 Nullable<T> 반환됩니다.

Null 조건부 연산자

?. 연산자는 문법적 인 설탕으로 자세한 null 검사를 피할 수 있습니다. 안전한 탐색 연산자 라고도합니다.


다음 예제에서 사용되는 클래스입니다.

public class Person
{
    public int Age { get; set; }
    public string Name { get; set; }
    public Person Spouse { get; set; }
}

객체가 null 일 가능성이있는 경우 (참조 형을 돌려주는 함수 등), 가능한 NullReferenceException 를 방지하기 위해서, 객체는 최초로 null가 체크되지 않으면 안됩니다. null 조건부 연산자가 없으면 다음과 같습니다.

Person person = GetPerson();

int? age = null;
if (person != null)
    age = person.Age;

null 조건부 연산자를 사용하는 동일한 예는 다음과 같습니다.

Person person = GetPerson();

var age = person?.Age;    // 'age' will be of type 'int?', even if 'person' is not null

교환 원 연결하기

null 조건부 연산자는 객체의 멤버와 하위 멤버에서 결합 될 수 있습니다.

// Will be null if either `person` or `person.Spouse` are null
int? spouseAge = person?.Spouse?.Age;

Null 통합 운영자와 결합

널 조건부 연산자는 널 통합 연산자 와 결합하여 기본값을 제공 할 수 있습니다.

// spouseDisplayName will be "N/A" if person, Spouse, or Name is null
var spouseDisplayName = person?.Spouse?.Name ?? "N/A";

Null 조건부 인덱스

the ?. 유사합니다 ?. 연산자 인 경우, 널 조건부 인덱스 연산자는 널이 될 수있는 콜렉션에 색인을 지정할 때 널 값을 점검합니다.

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 조건부 연산자는 확장 메서드와 함께 사용할 수 있습니다.

확장 메서드는 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을 반환합니다.

Person person = null;
int nameLength = person.GetNameLength(); // returns -1

?. 사용 ?. 메서드는 null 참조에 대해서 트리거되지 않고, 형태는 int? :

Person person = null;
int? nameLength = person?.GetNameLength(); // nameLength is null.

이 동작은 실제로 ?. operator works : NullReferenceExceptions 을 피하기 위해 널 인스턴스에 대한 인스턴스 메소드 호출을 피할 수 있습니다. 그러나 메서드가 선언 된 방법의 차이에도 불구하고 확장 메서드에 동일한 논리가 적용됩니다.

첫 번째 예제에서 확장 메서드가 호출 된 이유에 대한 자세한 내용은 확장 메서드 - null 확인 설명서를 참조하십시오.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow