where-begränsningar
Begränsa typparametrar.
where-begränsningar är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 3 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.
Varför begränsningar finns
Som standard behandlas en typparameter T nästan som object, så kompilatorn tillåter mycket få operationer på den. Begränsningar, som skrivs med where, talar om mer för kompilatorn om T.
Med den kunskapen kan Ni anropa metoder, skapa instanser eller jämföra värden på ett säkert sätt.
void Show<T>(T value) where T : IFormattable
{
// now ToString(format, provider) is available
}Gränssnittsbegränsningar
En gränssnittsbegränsning kräver att T implementerar ett visst gränssnitt. Metodkroppen kan då anropa medlemmarna i det gränssnittet.
Nedan garanterar where T : IComparable<T> att det finns en CompareTo-metod.
T Max<T>(T a, T b) where T : IComparable<T>
=> a.CompareTo(b) >= 0 ? a : b;Basklassbegränsningar
Ni kan kräva att T härstammar från en viss basklass. Då kan medlemmarna i den bastypen användas i den generiska koden.
Detta är vanligt i ramverk där alla entiteter delar en basklass.
class Animal { public string Name = ""; }
string NameOf<T>(T a) where T : Animal => a.Name;Begränsningen class
where T : class kräver att T är en referenstyp. Detta tillåter tilldelning av null och jämförelser av referenslikhet.
Det är typiskt för databaser, cachelagring och allt som lagrar nullbara referenser.
T? FindOrNull<T>(bool found, T value) where T : class
=> found ? value : null;Begränsningen struct
where T : struct kräver att T är en icke-nullbar värdetyp. Detta gör att Ni kan behandla T som en värdetyp och använda T? som en nullbar värdetyp.
Den används av hjälpfunktioner som endast fungerar med tal, uppräkningar eller små strukturer.
T? AsNullable<T>(T value) where T : struct
=> value;Begränsningen new()
Begränsningen new() kräver att T har en offentlig parameterlös konstruktor. Metodkroppen kan då skriva new T().
Fabriker och objektpooler förlitar sig på detta för att skapa instanser generiskt.
using System;
class Program
{
static T Make<T>() where T : new() => new T();
static void Main()
{
var list = Make<System.Collections.Generic.List<int>>();
Console.WriteLine(list.Count);
}
}Kombinera begränsningar
Ni kan använda flera begränsningar för en parameter. Ordningsreglerna kräver att class eller struct står först, därefter basklass, sedan gränssnitt och sist new().
Begränsningarna listas efter en enda where-klausul och separeras med kommatecken.
T Build<T>() where T : class, IComparable<T>, new()
=> new T();Flera where-klausuler
När en metod eller klass har flera typparametrar får var och en sin egen where-klausul. De skrivs efter varandra.
Detta håller begränsningarna för varje parameter tydligt åtskilda.
TResult Convert<TInput, TResult>(TInput x)
where TInput : class
where TResult : new()
=> new TResult();Ett körbart exempel på en begränsning
Detta kompletta program använder en begränsning med IComparable<T> för att hitta det större av två värden, och fungerar både för heltal och strängar.
Det är begränsningen som gör CompareTo tillåtet inuti metoden.
using System;
class Program
{
static T Max<T>(T a, T b) where T : IComparable<T>
=> a.CompareTo(b) >= 0 ? a : b;
static void Main()
{
Console.WriteLine(Max(3, 9));
Console.WriteLine(Max("apple", "pear"));
}
}Begränsningarna notnull och unmanaged
Nyare C# innehåller fler begränsningar. where T : notnull förbjuder nullbara typer, vilket är användbart för nycklar i ordlistor. where T : unmanaged begränsar T till blittable-värdetyper för lågnivåkod.
Dessa skärper säkerheten i specialiserade scenarier.
void Use<T>(T key) where T : notnull { }
unsafe void Raw<T>(T v) where T : unmanaged { }Begränsningar möjliggör funktionalitet – de begränsar den inte
Även om de ser ut som begränsningar låser de faktiskt upp nya möjligheter. Utan en begränsning kan Ni knappt använda T; med en begränsning får Ni tillgång till dess medlemmar.
Välj den minsta begränsning som gör att algoritmen fungerar, så förblir typparametern så flexibel som möjligt.
// No constraint: only object members available
string Name<T>(T x) => x.ToString();Snabbtest
Testa Er förståelse av where-begränsningar.
Sammanfattning
where-klausulen begränsar typparametrar med gränssnitt, basklass, class, struct, new(), notnull och unmanaged. Varje begränsning låser upp specifika operationer på T.
Ordna dem korrekt, använd en klausul per parameter och välj den minsta begränsning som algoritmen behöver.
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 ”where-begränsningar” gratis?
Ja – hela texten till ”where-begränsningar” 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 ”where-begränsningar”?
Begränsa typparametrar. 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 3 av 4.
Hur lång tid tar lektionen ”where-begränsningar”?
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
- Generiska metoder
- Generiska klasser
- where-begränsningar
- Generiska gränssnitt