Aktivera och förstå NRT
Aktivera nullable context, förstå nullable och non-nullable reference types och läs kompilatorvarningar.
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 warningsIcke-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); // safeFlö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 warningNullbarhetsvarningar: 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 nullInitiera 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-handlingSnabbkontroll
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
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
- Aktivera och förstå NRT
- Annotationer: ?, !, MaybeNull och NotNull
- Null-conditional- och null-coalescing-operatorer
- Migrera en kodbas till NRT