C# Academy · Lektion

Aktivera och förstå NRT

Aktivera nullable context, förstå nullable och non-nullable reference types och läs kompilatorvarningar.

Lektion 1 av 413 steg

Aktivera och förstå NRT är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 1 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.

Det miljarddyra misstaget

Tony Hoare, som uppfann null, kallade det sitt ”miljarddyra misstag”. I C# kunde alla referenstyper som standard vara null, vilket gjorde NullReferenceException till den vanligaste kraschen vid körning. Nullable Reference Types (NRT) löser detta på kompilatornivå.

Aktivera nullbarhetskontexten

Aktivera NRT globalt i projektfilen eller per fil med direktiv. När funktionen är aktiverad behandlar kompilatorn referenstyper som icke-nullbara som standard.

<!-- In .csproj — enable for the whole project -->
<PropertyGroup>
  <Nullable>enable</Nullable>
</PropertyGroup>

// Or per-file:
#nullable enable
// ... code with NRT warnings
#nullable disable
// ... code without NRT warnings

Icke-nullbara kontra nullbara referenstyper

Med NRT aktiverat betyder string att värdet aldrig är null, medan string? betyder att det kan vara null. Kompilatorn varnar om ni tilldelar null till en icke-nullbar typ eller derefererar en nullbar typ utan kontroll.

#nullable enable

string nonNull = "Hello";    // OK
string? maybeNull = null;    // OK — explicitly nullable

nonNull = null;              // WARNING: CS8600
Console.WriteLine(maybeNull.Length); // WARNING: CS8602 — may be null

// Fix:
if (maybeNull is not null)
    Console.WriteLine(maybeNull.Length); // safe

Flödesanalys

Kompilatorn utför flödesanalys — den följer null-status genom villkor och grenar och undertrycker varningar när den kan bevisa att ett värde inte är null.

string? name = GetName();

// After null check, name is treated as non-null:
if (name is not null)
    Console.WriteLine(name.Length);  // no warning

// Same with early return:
if (name is null) return;
Console.WriteLine(name.Length);     // no warning — null was returned

// Pattern matching:
if (name is string s)
    Console.WriteLine(s.ToUpper()); // no warning

Nullbarhetsvarningar: CS8600–CS8629

Viktiga NRT-varningar att förstå är: CS8600 (tilldelning av null till en icke-nullbar typ), CS8602 (dereferering av ett värde som kanske är null), CS8603 (returnering av null för en icke-nullbar typ) och CS8618 (oinitierat icke-nullbart fält).

#nullable enable

public class Order
{
    public string CustomerName { get; set; } // CS8618: not initialized
    public string? TrackingNumber { get; set; } // OK — nullable

    public Order(string name)
    {
        CustomerName = name; // now initialized — CS8618 gone
    }
}

string? s = GetValue();
Console.WriteLine(s.Length); // CS8602: s might be null

Initiera icke-nullbara fält

CS8618 utlöses när ett icke-nullbart fält eller en icke-nullbar egenskap inte anges i konstruktorn. Lösningar är att initiera det i deklarationen, kräva det via konstruktorn eller använda den nullförlåtande operatorn för DI-/ORM-mönster.

// Option 1: Initialize in declaration
public string Name { get; set; } = "";

// Option 2: Require via constructor
public class Product
{
    public string Name { get; }
    public Product(string name) => Name = name;
}

// Option 3: null-forgiving for ORM entities
public string Name { get; set; } = null!;
// null! tells compiler "trust me, this will be set by EF Core"

Nullbarhet i generiska typer

Generiska typparametrar kan begränsas till icke-nullbara typer. En where T : notnull-begränsning säkerställer att T aldrig kan vara null.

// Without constraint: T could be nullable
public T? Find<T>(int id) { ... }

// With notnull: T must be a non-nullable type
public T FindRequired<T>(int id) where T : notnull
{
    var result = InternalFind<T>(id);
    return result ?? throw new KeyNotFoundException();
}

// T? is meaningful only when T is known to be non-nullable
public T? FindOrDefault<T>(int id) where T : class { ... }

Nullbarhet i gränssnitt och överskuggningar

När ni implementerar ett gränssnitt eller överskuggar en metod måste nullbarhetsannoteringarna överensstämma. Kompilatorn kontrollerar att implementeringarna är minst lika icke-nullbara som gränssnittet anger.

public interface IRepository<T>
{
    T? FindById(int id);       // may return null
    T GetOrThrow(int id);      // never null
}

// Implementation:
public class ProductRepo : IRepository<Product>
{
    public Product? FindById(int id)  => _db.Find(id);
    public Product  GetOrThrow(int id) =>
        _db.Find(id) ?? throw new KeyNotFoundException();
}

Nullbara värdetyper kontra nullbara referenstyper

Blanda inte ihop int? (Nullable<int> — en omslutning för en värdetyp som fanns före C# 8) med string? (en NRT-annotering — endast vid kompilering, utan overhead vid körning).

// Nullable value type (runtime Nullable<int>)
int? age = null;
bool hasValue = age.HasValue;
int value  = age.GetValueOrDefault();

// Nullable reference type (compile-time annotation only)
string? name = null;
// string? has NO runtime wrapper — it's just a compile-time hint
// null check is still needed at runtime
if (name is not null)
    Console.WriteLine(name.ToUpper());

Undertrycka varningar med !

Den nullförlåtande operatorn (!) undertrycker en specifik nullbarhetsvarning när ni vet bättre än kompilatorn. Använd den sparsamt och dokumentera varför den är säker.

// Use ! when you know the value cannot be null
var user = _db.Users.FirstOrDefault(u => u.Email == email);
var name = user!.Name; // user is guaranteed by business logic

// EF Core navigation properties set by the framework:
public class Order
{
    public Customer Customer { get; set; } = null!; // set by EF Core
}

Verklighetsnära exempel: nullbart API-svar

En API-wrapper där fält kan finnas eller saknas i JSON-svaret — nullbarhetsannoteringar kommunicerar avsikten tydligt.

#nullable enable

public class WeatherResponse
{
    public string City { get; set; } = "";     // always present
    public double Temperature { get; set; }     // always present
    public string? Description { get; set; }    // optional field
    public string? AlertMessage { get; set; }   // only when there's an alert
}

// Consumer:
var weather = await api.GetWeatherAsync("London");
Console.WriteLine(weather.City);            // safe
Console.WriteLine(weather.Description?.ToUpper() ?? "N/A"); // safe null-handling

Snabbkontroll

Vilken overhead vid körning har Nullable Reference Types (string?) jämfört med vanliga referenstyper (string)?

Sammanfattning: aktivera och förstå NRT

Viktiga slutsatser:

  • Aktivera globalt med <Nullable>enable</Nullable> i .csproj
  • string = aldrig null; string? = kan vara null
  • Flödesanalys följer null-status genom grenar och returer
  • NRT-annoteringar används endast vid kompilering — ingen overhead vid körning
  • CS8618: initiera icke-nullbara fält i konstruktorn eller använd = null! för ORM
  • Använd ! sparsamt — dokumentera varför den nullförlåtande operatorn är säker
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 ”Aktivera och förstå NRT” gratis?

Ja – hela texten till ”Aktivera och förstå NRT” 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 ”Aktivera och förstå NRT”?

Aktivera nullable context, förstå nullable och non-nullable reference types och läs kompilatorvarningar. 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 1 av 4.

Hur lång tid tar lektionen ”Aktivera och förstå NRT”?

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. Aktivera och förstå NRT
  2. Annotationer: ?, !, MaybeNull och NotNull
  3. Null-conditional- och null-coalescing-operatorer
  4. Migrera en kodbas till NRT
← Tillbaka till C# Academy