널(null) 조건부 연산자 ?. 는 C# 6.0에서 도입되었습니다.
?. 가 하는 일은 객체의 멤버에 접근하기 전에 해당 객체가 null인지 검사하여
그 결과가 참(즉, 객체가 null)이면 그 결과로 null을 반환하고, 그렇지 않은 경우에는,
뒤에 지정된 멤버를 반환합니다.
?. 연산자를 쓰지 않았을 경우
class Foo
{
public int member;
}
class Mainapp
{
static void Main(string[] arg)
{
Foo foo = null;
int? bar;
if(foo == null)
{
bar = null;
}
else
{
bar = foo.member;
}
}
}
?. 연산자를 썻을 경우
class Foo
{
public int member;
}
class Mainapp
{
static void Main(string[] arg)
{
Foo foo = null;
int? bar;
bar = foo?.member;
// foo 객체가 null이 아니면 member필드에 접근하게 해줌
}
}
?[ ]도 동일한 기능을 수행하는 연산자입니다. ?[ ]는 ?. 와 비슷한 역할을 하지만, 객체의 멤버 접근이
아닌 배열과 같은 컬렉션 객체의 첨자를 이용한 참조에 사용된다는 점이 다릅니다.
class MainApp
{
static void Main(string[] args)
{
ArrayList a = null;
a?.Add("야구"); // a?. 가 null을 반환하므로 Add() 메소드는 호출되지 않음
a?.Add("축구");
Console.WriteLine($"Count : {a?.Count}");
Console.WriteLine($"{a?[0]}"); // a?. 가 null을 반환하므로
Console.WriteLine($"{a?[1]}"); // "Count:" 외에는 아무것도 출력하지 않습니다.
a = new ArrayList(); // a는 이제 더 이상 null이 아닙니다.
a?.Add("야구");
a?.Add("축구");
Console.WriteLine($"Count : {a?.Count}");
Console.WriteLine($"{a?[0]}");
Console.WriteLine($"{a?[1]}");
// Count :
//
//
// Count : 2
// 야구
// 축구
}
}