Konstruktordesign
Kommentar
Det här innehållet skrivs om med behörighet från Pearson Education, Inc. från Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Den utgåvan publicerades 2008, och boken har sedan dess reviderats helt i den tredje utgåvan. En del av informationen på den här sidan kan vara inaktuell.
Det finns två typer av konstruktorer: typkonstruktorer och instanskonstruktorer.
Typkonstruktorer är statiska och körs av CLR innan typen används. Instanskonstruktorer körs när en instans av en typ skapas.
Typkonstruktorer kan inte ta några parametrar. Instanskonstruktorer kan. Instanskonstruktorer som inte tar några parametrar kallas ofta för parameterlösa konstruktorer.
Konstruktorer är det mest naturliga sättet att skapa instanser av en typ. De flesta utvecklare söker efter och försöker använda en konstruktor innan de överväger alternativa sätt att skapa instanser (till exempel fabriksmetoder).
✔️ ÖVERVÄG att tillhandahålla enkla, idealiskt standardkonstruktorer.
En enkel konstruktor har ett mycket litet antal parametrar och alla parametrar är primitiver eller uppräkningar. Sådana enkla konstruktorer ökar ramverkets användbarhet.
✔️ ÖVERVÄG att använda en statisk fabriksmetod i stället för en konstruktor om semantiken för den önskade åtgärden inte mappas direkt till byggandet av en ny instans, eller om det känns onaturligt att följa konstruktorns designriktlinjer.
✔️ Använd konstruktorparametrar som genvägar för att ange huvudegenskaper.
Det bör inte finnas någon skillnad i semantik mellan att använda den tomma konstruktorn följt av vissa egenskapsuppsättningar och att använda en konstruktor med flera argument.
✔️ Använd samma namn för konstruktorparametrar och en egenskap om konstruktorparametrarna används för att helt enkelt ange egenskapen.
Den enda skillnaden mellan sådana parametrar och egenskaperna bör vara hölje.
✔️ Utför minimalt arbete i konstruktorn.
Konstruktorer bör inte utföra mycket annat arbete än att avbilda konstruktorparametrarna. Kostnaden för annan bearbetning bör fördröjas tills det krävs.
✔️ Utlös undantag från instanskonstruktorer, om det är lämpligt.
✔️ Deklarera uttryckligen den offentliga parameterlösa konstruktorn i klasser, om en sådan konstruktor krävs.
Om du inte uttryckligen deklarerar några konstruktorer för en typ lägger många språk (till exempel C#) automatiskt till en offentlig parameterlös konstruktor. (Abstrakta klasser hämtar en skyddad konstruktor.)
Om du lägger till en parameteriserad konstruktor i en klass förhindrar det att kompilatorn lägger till den parameterlösa konstruktorn. Detta orsakar ofta oavsiktliga icke-bakåtkompatibla ändringar.
❌ UNDVIK att explicit definiera parameterlösa konstruktorer på structs.
Detta gör att matrisen skapas snabbare, för om den parameterlösa konstruktorn inte har definierats behöver den inte köras på varje plats i matrisen. Observera att många kompilatorer, inklusive C#, inte tillåter att structs har parameterlösa konstruktorer av den anledningen.
❌ UNDVIK att anropa virtuella medlemmar på ett objekt i konstruktorn.
Om du anropar en virtuell medlem anropas den mest härledda åsidosättningen, även om konstruktorn av den mest härledda typen inte har körts fullständigt ännu.
Riktlinjer för typkonstruktor
✔️ Gör statiska konstruktorer privata.
En statisk konstruktor, även kallad klasskonstruktor, används för att initiera en typ. CLR anropar den statiska konstruktorn innan den första instansen av typen skapas eller några statiska medlemmar på den typen anropas. Användaren har ingen kontroll över när den statiska konstruktorn anropas. Om en statisk konstruktor inte är privat kan den anropas med annan kod än CLR. Beroende på vilka åtgärder som utförs i konstruktorn kan detta orsaka oväntat beteende. C#-kompilatorn tvingar statiska konstruktorer att vara privata.
❌ Utlöser INTE undantag från statiska konstruktorer.
Om ett undantag utlöses från en typkonstruktor kan typen inte användas i den aktuella programdomänen.
✔️ ÖVERVÄG att initiera statiska fält infogade i stället för att uttryckligen använda statiska konstruktorer, eftersom körningen kan optimera prestanda för typer som inte har en explicit definierad statisk konstruktor.
Portioner © 2005, 2009 Microsoft Corporation. Med ensamrätt.
Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, publicerad 22 okt 2008 av Addison-Wesley Professional som en del av Microsoft Windows Development Series.