C# Academy · Lektion

init-only-settere

Opret properties, der kun kan angives ved initialisering.

Lektion 1 af 413 trin

init-only-settere er en gratis C# Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C# Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C# Academy-kurset indeholder 4 lektioner i alt.

Settere, der kun bruger init

En init-accessor gør det muligt at angive en egenskab under oprettelsen af et objekt, herunder i objektinitialiseringer, men gør den skrivebeskyttet bagefter. Formen er { get; init; }.

using System;

class Point {
    public int X { get; init; }
    public int Y { get; init; }
}

var p = new Point { X = 3, Y = 4 };
Console.WriteLine(p.X + "," + p.Y); // 3,4

Angiv kun under initialisering

Efter objektet er oprettet, giver tildeling til en init-egenskab en kompileringsfejl, hvilket garanterer uforanderlighed efter oprettelsen.

using System;

class Config {
    public string Name { get; init; }
}

var c = new Config { Name = "prod" };
// c.Name = "dev"; // compile error
Console.WriteLine(c.Name); // prod

Objektinitialiseringer fungerer stadig

Den store fordel i forhold til en skrivebeskyttet egenskab, der kun kan læses, er, at init understøtter syntaksen for objektinitialiseringer, så du ikke behøver en konstruktør for hver egenskab.

using System;

class Settings {
    public bool DarkMode { get; init; }
    public int FontSize { get; init; }
}

var s = new Settings { DarkMode = true, FontSize = 14 };
Console.WriteLine(s.DarkMode + " " + s.FontSize); // True 14

Kombination med konstruktører

Du kan angive init-egenskaber fra en konstruktør og samtidig tillade tilsidesættelser i initialiseringer.

using System;

class User {
    public string Role { get; init; } = "guest";
    public User() { }
}

var u = new User { Role = "admin" };
Console.WriteLine(u.Role); // admin

Standardværdier

init-egenskaber kan have standardinitialiseringer, som gælder, medmindre de tilsidesættes under oprettelsen.

using System;

class Options {
    public int Retries { get; init; } = 3;
}

Console.WriteLine(new Options().Retries);            // 3
Console.WriteLine(new Options { Retries = 5 }.Retries); // 5

init kontra set

En set-accessor tillader ændringer når som helst; init begrænser tildeling til oprettelsesfasen. Vælg init for data, der skal være uforanderlige efter oprettelsen.

using System;

class Mutable { public int V { get; set; } }
class Frozen  { public int V { get; init; } }

var m = new Mutable { V = 1 };
m.V = 2; // allowed
Console.WriteLine(m.V); // 2

init med validering

Du kan implementere en eksplicit init-krop med et underliggende felt for at validere den tildelte værdi.

using System;

class Percentage {
    private int _value;
    public int Value {
        get => _value;
        init => _value = (value < 0 || value > 100)
            ? throw new ArgumentOutOfRangeException()
            : value;
    }
}

Console.WriteLine(new Percentage { Value = 80 }.Value); // 80

init i records

Positionsbaserede record-egenskaber bruger som standard kun init, og derfor er records uforanderlige, samtidig med at de understøtter with-kopier.

using System;

record Account(string Id, decimal Balance);

var a = new Account("A1", 100m);
Console.WriteLine(a.Balance); // 100

Indlejrede objektinitialiseringer

init fungerer med indlejrede objektinitialiseringer, så du kan opbygge komplekse uforanderlige objektgrafer i ét udtryk.

using System;

class Address { public string City { get; init; } }
class Person { public string Name { get; init; } public Address Home { get; init; } }

var p = new Person { Name = "Lin", Home = new Address { City = "Oslo" } };
Console.WriteLine(p.Name + " / " + p.Home.City); // Lin / Oslo

init og nedarvning

Afledte klasser kan angive basisklassens init-egenskaber via objektinitialiseringer, fordi oprettelsesfasen omfatter hele objektet.

using System;

class Base { public int Id { get; init; } }
class Item : Base { public string Name { get; init; } }

var i = new Item { Id = 1, Name = "Pen" };
Console.WriteLine(i.Id + " " + i.Name); // 1 Pen

Sæt det hele sammen

En uforanderlig DTO, der udelukkende er bygget med init-egenskaber og en objektinitialisering.

using System;

class OrderDto {
    public int Id { get; init; }
    public string Customer { get; init; }
    public decimal Amount { get; init; }
}

var o = new OrderDto { Id = 7, Customer = "Ada", Amount = 49.9m };
Console.WriteLine(o.Id + " " + o.Customer + " " + o.Amount); // 7 Ada 49.9

Hurtigt tjek

Test din forståelse af settere, der kun bruger init.

Opsamling

Du har lært om settere, der kun bruger init.

  • { get; init; } tillader kun tildeling under oprettelsen.
  • Objektinitialiseringer fungerer med init-egenskaber.
  • Du kan tilføje validering via en eksplicit init-krop.
  • Positionsbaserede record-egenskaber bruger som standard init.
Gratis at komme i gang

Lær C# med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
93
Lektioner
346

Ofte stillede spørgsmål

Er lektionen “init-only-settere” gratis?

Ja — hele teksten til “init-only-settere” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C# Academy-kurset, skal du opgradere til CoddyKit PRO. C# Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “init-only-settere”?

Opret properties, der kun kan angives ved initialisering. Du øver dig i C# Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C# Academy?

Der kræves ingen tidligere erfaring. C# Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “init-only-settere”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C# Academy-lektion?

Ja. Alle C# Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. init-only-settere
  2. Modifikatoren required
  3. Mønstre for uforanderlige objekter
  4. with-udtryk på records
← Tilbage til C# Academy