C# Academy · Lektion

Null-conditional-operatorn

Säker åtkomst med ?..

Lektion 2 av 413 steg

Null-conditional-operatorn är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C# Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C# Academy innehåller totalt 4 lektioner.

Problemet med null-kedjor

Om ni försöker komma åt en medlem på en null-referens kastas en NullReferenceException. Det är en av de vanligaste körtidskrascherna i C#.

När ni kedjar anrop som user.Address.City kan vilken länk som helst i kedjan vara null, och den gamla lösningen var en lång rad if-kontroller.

Lär känna ?.

Den null-villkorliga operatorn ?. kortsluter hela uttrycket. Om vänster sida är null blir resultatet null i stället för att ett undantag kastas.

Det kan läsas som: "kom åt den här medlemmen, men bara om objektet inte är null".

string name = null;
int? length = name?.Length;
System.Console.WriteLine(length == null);

Resultatet blir nullbart

Eftersom ?. kan ge null blir resultattypen nullbar. name?.Length är int?, inte int.

Därför lagrar ni resultatet i en int? i stället för i en vanlig int.

string text = "hello";
int? len = text?.Length;
System.Console.WriteLine(len);

Ett körbart exempel

Det här programmet visar hur ?. returnerar ett värde när objektet finns och null när det inte gör det.

Kör programmet och lägg märke till att inget undantag någonsin kastas.

using System;

class Program
{
    static void Main()
    {
        string a = "world";
        string b = null;
        Console.WriteLine(a?.ToUpper());
        Console.WriteLine(b?.ToUpper() ?? "(null)");
    }
}

Kedja flera ?.

Ni kan kedja ?. över flera medlemmar. Så snart någon del är null avbryts hela kedjan och null returneras.

Därför är customer?.Order?.Total säkert även om customer eller Order är null.

string s = null;
int? upperLen = s?.ToUpper()?.Length;
System.Console.WriteLine(upperLen == null);

Null-villkorlig indexerare ?[]

Det finns en indexerarvariant, ?[], för arrayer och listor. Om samlingen är null returnerar indexåtkomsten null i stället för att orsaka en krasch.

Observera: den skyddar mot att samlingen är null, men inte mot ett index utanför giltigt intervall.

int[] data = null;
int? first = data?[0];
System.Console.WriteLine(first == null);

Anropa metoder säkert

?. skyddar även metodanrop. list?.Clear() anropar Clear endast om list inte är null; annars gör det ingenting.

För en metod som returnerar void blir hela satsen helt enkelt en no-op när värdet är null.

System.Collections.Generic.List<int> list = null;
list?.Add(5);
System.Console.WriteLine("No crash");

Trådsäker händelseutlösning

Ett klassiskt användningsområde är att utlösa händelser. SomeEvent?.Invoke(this, args) utlöser händelsen säkert endast när minst en hanterare är prenumererad.

Detta ersatte det gamla null-kontrollmönstret, som kunde drabbas av en kapplöpning mellan kontrollen och anropet.

System.Action handler = null;
handler?.Invoke();
System.Console.WriteLine("Invoked safely");

Kombinera med ??

?. passar naturligt ihop med den null-koalescerande operatorn ?? för att ange ett reservvärde när kedjan är null.

name?.Length ?? 0 ger längden, eller 0 om name är null.

string name = null;
int length = name?.Length ?? 0;
System.Console.WriteLine(length);

En subtil fallgrop

Även när den slutliga värdetypen inte är nullbar gör ?. uttrycket nullbart. list?.Count är int?, inte int.

Om ni behöver en vanlig int kan ni följa uttrycket med ?? 0 eller använda GetValueOrDefault().

var list = new System.Collections.Generic.List<int> { 1, 2 };
int count = list?.Count ?? 0;
System.Console.WriteLine(count);

Fullständig jämförelse

Det här programmet jämför den utförliga if-metoden med den kortfattade varianten med ?.. Båda undviker undantaget, men ?. är betydligt renare.

using System;

class Program
{
    static void Main()
    {
        string s = null;
        int len = s != null ? s.Length : -1;
        Console.WriteLine(len);
        Console.WriteLine(s?.Length ?? -1);
    }
}

Snabbtest

Testa er förståelse av den null-villkorliga operatorn.

Sammanfattning

Den null-villkorliga operatorn ?. (och indexeraren ?[]) stoppar medlemsåtkomsten när objektet är null och returnerar null i stället för att kasta ett undantag.

Resultatet blir nullbart, så kombinera operatorn med ?? för att ange ett reservvärde.

Gratis att börja

Lär dig C# med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
93
Lektioner
346

Vanliga frågor

Är lektionen ”Null-conditional-operatorn” gratis?

Ja – hela texten till ”Null-conditional-operatorn” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C# Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C# Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Null-conditional-operatorn”?

Säker åtkomst med ?.. Ni övar på C# Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C# Academy?

Du behöver inga förkunskaper. Utbildningen i C# Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Null-conditional-operatorn”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C# Academy-lektionen?

Ja. Varje C# Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Nullable-värdetyper
  2. Null-conditional-operatorn
  3. Null-coalescing-operatorer
  4. Skydda mot null
← Tillbaka till C# Academy