null 조건부 연산자

널(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
            // 야구
            // 축구
        }
    }