init-only-settere
Opret properties, der kun kan angives ved initialisering.
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,4Angiv 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); // prodObjektinitialiseringer 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 14Kombination 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); // adminStandardvæ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); // 5init 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); // 2init 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); // 80init 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); // 100Indlejrede 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 / Osloinit 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 PenSæ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.9Hurtigt 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.
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.