Introduktion till klasser
Referenstyper
En typ som definieras som en class
är en referenstyp. När du deklarerar en variabel av en referenstyp innehåller variabeln värdet null
tills du uttryckligen skapar en instans av klassen med hjälp av operatorn new
eller tilldelar den ett objekt av en kompatibel typ som skapats någon annanstans, som du ser i följande exempel:
//Declaring an object of type MyClass.
MyClass mc = new MyClass();
//Declaring another object of the same type, assigning it the value of the first object.
MyClass mc2 = mc;
När objektet skapas allokeras tillräckligt med minne på den hanterade heapen för det specifika objektet, och variabeln innehåller bara en referens till platsen för objektet. Minnet som används av ett objekt frigörs av funktionen för automatisk minneshantering i CLR, som kallas skräpinsamling. Mer information om skräpinsamling finns i Automatisk minneshantering och skräpinsamling.
Deklarera klasser
Klasser deklareras med hjälp av nyckelordet class
följt av en unik identifierare, enligt följande exempel:
//[access modifier] - [class] - [identifier]
public class Customer
{
// Fields, properties, methods and events go here...
}
En valfri åtkomstmodifierare föregår nyckelordet class
. Standardåtkomsten för en class
typ är internal
. Eftersom public
används i det här fallet kan vem som helst skapa instanser av den här klassen. Namnet på klassen följer nyckelordet class
. Namnet på klassen måste vara ett giltigt C# -identifierarnamn. Resten av definitionen är klasstexten, där beteendet och data definieras. Fält, egenskaper, metoder och händelser i en klass kallas gemensamt för klassmedlemmar.
Skapa objekt
Även om de ibland används utbytbart är en klass och ett objekt olika saker. En klass definierar en typ av objekt, men det är inte själva objektet. Ett objekt är en konkret entitet baserad på en klass och kallas ibland för en instans av en klass.
Objekt kan skapas med hjälp av nyckelordet new
följt av namnet på klassen, så här:
Customer object1 = new Customer();
När en instans av en klass skapas skickas en referens till objektet tillbaka till programmeraren. I föregående exempel object1
är en referens till ett objekt som baseras på Customer
. Den här referensen refererar till det nya objektet men innehåller inte själva objektdata. I själva verket kan du skapa en objektreferens utan att skapa ett objekt alls:
Customer object2;
Vi rekommenderar inte att du skapar objektreferenser som inte refererar till ett objekt eftersom det inte går att komma åt ett objekt via en sådan referens vid körning. En referens kan referera till ett objekt, antingen genom att skapa ett nytt objekt eller genom att tilldela det ett befintligt objekt, till exempel följande:
Customer object3 = new Customer();
Customer object4 = object3;
Den här koden skapar två objektreferenser som båda refererar till samma objekt. Därför återspeglas alla ändringar i objektet som görs i object3
efterföljande användningar av object4
. Eftersom objekt som baseras på klasser refereras till med referens kallas klasser för referenstyper.
Konstruktorer och initiering
I föregående avsnitt introducerades syntaxen för att deklarera en klasstyp och skapa en instans av den typen. När du skapar en instans av en typ vill du se till att dess fält och egenskaper initieras till användbara värden. Det finns flera sätt att initiera värden:
- Acceptera standardvärden
- Fältinitierare
- Konstruktorparametrar
- Objektinitierare
Varje .NET-typ har ett standardvärde. Vanligtvis är det värdet 0 för nummertyper och null
för alla referenstyper. Du kan lita på det standardvärdet när det är rimligt i din app.
När .NET-standardvärdet inte är rätt värde kan du ange ett initialt värde med hjälp av en fältinitierare:
public class Container
{
// Initialize capacity field to a default value of 10:
private int _capacity = 10;
}
Du kan kräva att anropare anger ett initialt värde genom att definiera en konstruktor som ansvarar för att ange det ursprungliga värdet:
public class Container
{
private int _capacity;
public Container(int capacity) => _capacity = capacity;
}
Från och med C# 12 kan du definiera en primär konstruktor som en del av klassdeklarationen:
public class Container(int capacity)
{
private int _capacity = capacity;
}
Om du lägger till parametrar i klassnamnet definieras den primära konstruktorn. Dessa parametrar är tillgängliga i klasstexten, som innehåller dess medlemmar. Du kan använda dem för att initiera fält eller någon annanstans där de behövs.
Du kan också använda required
modifieraren för en egenskap och tillåta anropare att använda en objektinitierare för att ange det ursprungliga värdet för egenskapen:
public class Person
{
public required string LastName { get; set; }
public required string FirstName { get; set; }
}
Tillägget av nyckelordsmandaten required
som anropare måste ange dessa egenskaper som en del av ett new
uttryck:
var p1 = new Person(); // Error! Required properties not set
var p2 = new Person() { FirstName = "Grace", LastName = "Hopper" };
Klassarv
Klasser stöder fullständigt arv, en grundläggande egenskap hos objektorienterad programmering. När du skapar en klass kan du ärva från alla andra klasser som inte har definierats som sealed
. Andra klasser kan ärva från din klass och åsidosätta virtuella klassmetoder. Dessutom kan du implementera ett eller flera gränssnitt.
Arv utförs med hjälp av en härledning, vilket innebär att en klass deklareras med hjälp av en basklass från vilken den ärver data och beteende. En basklass anges genom att lägga till ett kolon och namnet på basklassen efter det härledda klassnamnet, så här:
public class Manager : Employee
{
// Employee fields, properties, methods and events are inherited
// New Manager fields, properties, methods and events go here...
}
När en klassdeklaration innehåller en basklass ärver den alla medlemmar i basklassen förutom konstruktorerna. Mer information finns i Arv.
En klass i C# kan bara ärva direkt från en basklass. Men eftersom en basklass själv kan ärva från en annan klass kan en klass indirekt ärva flera basklasser. Dessutom kan en klass direkt implementera ett eller flera gränssnitt. Mer information finns i Gränssnitt.
En klass kan deklareras som abstract
. En abstrakt klass innehåller abstrakta metoder som har en signaturdefinition men ingen implementering. Abstrakta klasser kan inte instansieras. De kan bara användas via härledda klasser som implementerar abstrakta metoder. En förseglad klass tillåter däremot inte att andra klasser härleds från den. Mer information finns i Abstrakta och förseglade klasser och klassmedlemmar.
Klassdefinitioner kan delas upp mellan olika källfiler. Mer information finns i Partiella klasser och metoder.
Språkspecifikation för C#
Mer information finns i C#-språkspecifikationen. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.