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 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 확인 설명서를 참조하십시오.