다음을 통해 공유


????= 연산자 - null 병합 연산자

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

연산자의 ??= 왼쪽 피연산자는 변수, 속성 또는 인덱서 요소여야 합니다.

C# 언어 참조는 가장 최근에 릴리스된 C# 언어 버전을 문서화합니다. 또한 예정된 언어 릴리스의 공개 미리 보기 기능에 대한 초기 설명서도 포함되어 있습니다.

설명서는 언어의 마지막 세 버전 또는 현재 공개 미리 보기에서 처음 도입된 기능을 식별합니다.

팁 (조언)

C#에서 기능이 처음 도입된 시기를 찾으려면 C# 언어 버전 기록에 대한 문서를 참조하세요.

?? 연산자의 왼쪽 피연산자의 ??= 형식은 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 형식 값이 기본 값 형식의 기본값일 때 사용할 값인 null 경우 메서드를 사용합니다.

  • 인수 확인 코드를 보다 간결하게 만들려면 연산자의 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 병합 연산자 섹션을 참조하세요.

연산자에 ??= 대한 자세한 내용은 C# 언어 사양의 복합 할당 섹션을 참조하세요.

참고하십시오