Operator ten pojawił się w C# 6.0. Pozwala on nam skrócić kod sprawdzający czy dany obiekt, właściwość posiada wartość null.

Zobaczmy przykład:

var nazwa = firma?.Wydzial?.Nazwa;

Najpierw sprawdzane jest czy obiekt o nazwie firma jest null jeżeli tak to zmienna nazwa przyjmie wartość null. W przeciwnym wypadku sprawdzona zostanie właściwość Wydział według tego samego schematu. Jeżeli obie wartości nie są null zostanie zwrócona wartośc dla właściwości Nazwa.

Alternatywą operatora nullable jest zastosowanie instrukcji warunkowej if:

if (firma != null && firma.Wydzial !=null)
  var nazwa = firma.Wydzial.Nazwa;

Jeżeli nie użyjemy instrukcji warunkowej if lub operatora nullable a obiekt firma lub właściwość Wydzial będzie posiadał wartość null zostanie zwrócony wyjątek.

Zobaczmy prosty przykład:

   class Firma{
           private string nazwa;
           private Wydzial wydzial;
           public string Nazwa { get; set;}
           public Wydzial Wydzial { get; set; }
      }
       class Wydzial {
           private string nazwa;
           public string Nazwa { get; set; }
       }
class Program{
    
       static void Main(){
           var firma = new Firma();
           Console.WriteLine("Nazwa firmy to: " + firma.Wydzial.Nazwa);
           Console.ReadLine();
       }
   }

Po uruchomieniu aplikacji zwrócony zostanie błąd:

error

Rys. Błąd zgłoszony przez kompilator

Aby pozbyć się błędu użyjmy najpierw instrukcji warunkowej if:

static void Main() {
           var firma = new Firma();

           if (firma != null && firma.Wydzial !=null)
               Console.WriteLine("Nazwa firmy to: " +firma.Wydzial.Nazwa);
           else
             Console.WriteLine("Nazwa firmy to: ");
            
          Console.ReadLine();
       }

Rezultat działania aplikacji:

1

Rys. Działanie aplikacji

W przypadku gdy będziemy mieć w kodzie dużo miejsc, gdzie obiekt, może mieć wartość null pisanie za każdym razem instrukcji warunkowej if może zmniejszyć czytelność kodu. Możemy rozwiązać ten problem stosując operator nullable:

static void Main(){
           var firma = new Firma();
           Console.WriteLine("Nazwa firmy to: " +firma?.Wydzial?.Nazwa);
           Console.ReadLine();
       }

Rezultat działania aplikacji:

1
Rezultat działania aplikacji

Rys. Działanie aplikacji

Jak widzimy rezultat działania aplikacji jest taki sam.

Podsumowanie:
Operatora nullable, możemy użyć gdy korzystamy z C# 6.0. Stosujemy go gdy istnieje możliwość, że dany obiekt może mieć wartość null a chcemy odczytać jego właściwość. Operator ten skraca kod oraz zwiększa jego czytelność.