본문 바로가기
개발/기본) 기본기

기본기)c#) ?. , ??, ??= 연산자

by 테샤르 2021. 9. 28.

?. , ??, ??= 연산자

 

C# 6 이상에서 사용할 수 있는 null 조건부 연산자는 피연산자가 null이 아닌 것으로 평가되었을 때만 멤버 액세스

?. 또는 요소 액세스, ?[]연산을 피연산자에게 적용해서 null을 반환을 한다.

 

예시를 보면 다음과 같다.

A?.B.C();

A가 null이 아니면 B는 평가되지 않고 C()는 호출되지 않는다.

double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum)
{
    return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN;
}

var sum1 = SumNumbers(null, 0);
Console.WriteLine(sum1);  // output: NaN

var numberSets = new List<double[]>
{
    new[] { 1.0, 2.0, 3.0 },
    null
};

var sum2 = SumNumbers(numberSets, 0);
Console.WriteLine(sum2);  // output: 6

var sum3 = SumNumbers(numberSets, 1);
Console.WriteLine(sum3);  // output: NaN

??= 는 왼쪽 피연산자가 null으로 계산되는 경우에만 오른쪽의 피연산자의 값을 왼쪽에 대입한다.

반응형

예시를 보면 다음과 같다.  

numbers값이 null이기 때문에 5의 값을 대입한다.

List<int> numbers = null;
int? a = null;

(numbers ??= new List<int>()).Add(5);
Console.WriteLine(string.Join(" ", numbers));  // output: 5

numbers.Add(a ??= 0);
Console.WriteLine(string.Join(" ", numbers));  // output: 5 0
Console.WriteLine(a);  // output: 0

유의사항으로는 다음과 같다.

?? 및 ??= 연산자는 오버 로드할 수 없습니다.

C#의 버전에 따라 사용할 수 있는 연산자가 제약이 있습니다.

반응형

 

 

C#의 버전이 올라가면서 연산자의 표현이 좀 더 간결해진 것이 특징이다.

Old Code와 비교하게 되면 다음과 같다. 

 

<Old Code>

if (variable is null)
{
    variable = expression;
}

<C# 8.0>

variable ??= expression;

개인적으로는 이렇게 사용을 하는 것도 괜찮지만 꼭 필수는 아니다.

다만 알고는 있어야 해당 코드에 대한 의미를 파악할 수 있다.

 

 

Microsoft 멤버 액세스 연산자 및 식 : [링크]

 

멤버 액세스 연산자 및 식 - C# 참조

형식 멤버에 액세스하는 데 사용하는 C# 연산자에 대해 알아봅니다.

docs.microsoft.com

Microsoft ?? 및 ??=연산자 : [링크]

 

?? 및 ??= 연산자 - C# 참조

C# null 병합 연산자인 ?? 및 ??=에 대해 알아봅니다.

docs.microsoft.com

 

★☆☆☆☆

 

반응형

댓글