null 병합 연산자는 왼쪽 피연산자의 값이 null이 아닌 경우 해당 값을 반환하고, 그렇지 않으면 오른쪽 피연산자를 평가하여 그 결과를 반환합니다. 왼쪽 피연산자가 null이 아닌 것으로 평가되면 ??
연산자는 오른쪽 피연산자를 평가하지 않습니다. null 병합 할당 연산자 ??=
는 왼쪽 피연산자가 null
으로 평가될 때만 오른쪽 피연산자의 값을 왼쪽 피연산자에 할당합니다. 왼쪽 피연산자가 null이 아닌 것으로 평가되면 ??=
연산자는 오른쪽 피연산자를 평가하지 않습니다.
List<int>? numbers = null;
int? a = null;
Console.WriteLine((numbers is null)); // expected: true
// if numbers is null, initialize it. Then, add 5 to numbers
(numbers ??= new List<int>()).Add(5);
Console.WriteLine(string.Join(" ", numbers)); // output: 5
Console.WriteLine((numbers is null)); // expected: false
Console.WriteLine((a is null)); // expected: true
Console.WriteLine((a ?? 3)); // expected: 3 since a is still null
// if a is null then assign 0 to a and add a to the list
numbers.Add(a ??= 0);
Console.WriteLine((a is null)); // expected: false
Console.WriteLine(string.Join(" ", numbers)); // output: 5 0
Console.WriteLine(a); // output: 0
연산자의 ??=
왼쪽 피연산자는 변수, 속성 또는 인덱서 요소여야 합니다.
및 ??
연산자의 왼쪽 피연산자의 ??=
형식은 null을 허용하지 않는 값 형식일 수 없습니다. 특히 제약이 없는 형식 매개 변수와 함께 null 병합 연산자를 사용할 수 있습니다.
private static void Display<T>(T a, T backup)
{
Console.WriteLine(a ?? backup);
}
null 병합 연산자는 우결합적입니다. 즉, 형식의 표현입니다.
a ?? b ?? c
d ??= e ??= f
다음처럼 평가됩니다.
a ?? (b ?? c)
d ??= (e ??= f)
예시
??
및 ??=
연산자는 다음 시나리오에서 유용할 수 있습니다.
null 조건부 연산자가 있는 식에서 연산
?.
?[]
자를 사용하여??
null 조건부 연산이 있는 식의 결과가 다음과 같은 경우에 대비하여 계산할 대체 식을 제공할 수 있습니다.null
double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum) { return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN; } var sum = SumNumbers(null, 0); Console.WriteLine(sum); // output: NaN
nullable 값 형식을 사용하고 기본 값 형식의 값을 제공해야 하는 경우 연산자를 사용하여
??
nullable 형식 값이null
다음과 같은 경우에 대비하여 제공할 값을 지정합니다.int? a = null; int b = a ?? -1; Console.WriteLine(b); // output: -1
Nullable<T>.GetValueOrDefault() 메서드는 nullable 형식 값에서 사용할 값이 기본 데이터 형식의 기본값이어야 하는 경우에 사용합니다.
연산자의
throw
오른쪽 피연산??
자로 식을 사용하여 인수 확인 코드를 더 간결하게 만들 수 있습니다.public string Name { get => name; set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null"); }
앞의 예제에서는 식 본문 멤버 를 사용하여 속성을 정의하는 방법도 보여 줍니다.
연산자를
??=
사용하여 양식의 코드를 바꿀 수 있습니다.if (variable is null) { variable = expression; }
다음 코드를 사용합니다.
variable ??= expression;
연산자 오버로드 가능성
??
와 ??=
연산자는 오버로드할 수 없습니다.
C# 언어 사양
연산자에 ??
대한 자세한 내용은 C# 언어 사양의 null 병합 연산자 섹션을 참조하세요.
??=
운영자에 대한 자세한 내용은 기능 제안서를 확인하십시오.
참고하십시오
.NET