Designregler
Designregler stöder efterlevnad av designriktlinjerna för .NET Framework.
I detta avsnitt
Regel | beskrivning |
---|---|
CA1000: Deklarera inte statiska medlemmar på generiska typer | När en statisk medlem av en allmän typ anropas måste typargumentet anges för typen. När en allmän instansmedlem som inte stöder slutsatsdragning anropas måste typargumentet anges för medlemmen. I dessa två fall är syntaxen för att ange typargumentet annorlunda och lätt förvirrad. |
CA1001: Typer som äger disponibla fält ska vara disponibla | En klass deklarerar och implementerar ett instansfält som är av typen System.IDisposable och klassen implementerar inte IDisposable. En klass som deklarerar ett IDisposable-fält äger indirekt en ohanterad resurs och bör implementera gränssnittet IDisposable. |
CA1002: Exponera inte allmänna listor | System.Collections.Generic.List<(Of <(T>)>) är en allmän samling som är utformad för prestanda, inte arv. Därför innehåller List inga virtuella medlemmar. De generiska samlingar som är utformade för arv bör exponeras i stället. |
CA1003: Använda allmänna händelsehanterarinstanser | En typ innehåller ett ombud som returnerar void, vars signatur innehåller två parametrar (det första ett objekt och den andra en typ som kan tilldelas EventArgs), och den innehållande sammansättningsmålen .NET Framework 2.0. |
CA1005: Undvik överdrivna parametrar för generiska typer | Ju fler typparametrar en allmän typ innehåller, desto svårare är det att veta och komma ihåg vad varje typparameter representerar. Det är vanligtvis uppenbart med en typparameter, som i Lista<T>, och i vissa fall med två typparametrar, som i Dictionary<TKey, TValue>. Men om det finns fler än två typparametrar blir svårigheten för stor för de flesta användare. |
CA1008: Uppräkningar bör ha noll värde | Standardvärdet för en onitialiserad uppräkning, precis som andra värdetyper, är noll. En icke-uppräkning som tillskrivs en uppräkning bör definiera en medlem med värdet noll så att standardvärdet är ett giltigt värde för uppräkningen. Om en uppräkning med attributet FlagsAttribute definierar en nollvärdesmedlem, bör dess namn vara "Ingen" för att indikera att inga värden har angetts i uppräkningen. |
CA1010: Samlingar bör implementera generiskt gränssnitt | Om du vill bredda användbarheten för en samling implementerar du ett av de generiska samlingsgränssnitten. Sedan kan samlingen användas för att fylla i generiska samlingstyper. |
CA1012: Abstrakta typer bör inte ha offentliga konstruktorer | Konstruktorer för abstrakta typer kan bara anropas av härledda typer. Eftersom offentliga konstruktorer skapar instanser av en typ och du inte kan skapa instanser av en abstrakt typ, är en abstrakt typ som har en offentlig konstruktor felaktigt utformad. |
CA1014: Markera sammansättningar med CLSCompliantAttribute | Common Language Specification (CLS) definierar namngivningsbegränsningar, datatyper och regler som sammansättningar måste överensstämma med om de ska användas mellan olika programmeringsspråk. Bra design kräver att alla sammansättningar uttryckligen anger CLS-efterlevnad med hjälp av CLSCompliantAttribute. Om det här attributet inte finns i en sammansättning är sammansättningen inte kompatibel. |
CA1016: Markera sammansättningar med AssemblyVersionAttribute | .NET använder versionsnumret för att unikt identifiera en sammansättning och för att binda till typer i starkt namngivna sammansättningar. Versionsnumret används tillsammans med versions- och utgivarprincipen. Som standard körs program endast med den sammansättningsversion som de skapades med. |
CA1017: Markera sammansättningar med ComVisibleAttribute | ComVisibleAttribute avgör hur COM-klienter får åtkomst till hanterad kod. Bra design avgör att sammansättningar uttryckligen anger COM-synlighet. COM-synlighet kan anges för hela sammansättningen och sedan åsidosättas för enskilda typer och typmedlemmar. Om det här attributet inte finns är innehållet i sammansättningen synligt för COM-klienter. |
CA1018: Markera attribut med AttributeUsageAttribute | När du definierar ett anpassat attribut markerar du det med hjälp av AttributeUsageAttribute för att ange var i källkoden det anpassade attributet kan tillämpas. Innebörden och den avsedda användningen av ett attribut avgör dess giltiga platser i koden. |
CA1019: Definiera accessorer för attributargument | Attribut kan definiera obligatoriska argument som måste anges när du tillämpar attributet på ett mål. Dessa kallas även för positionsargument eftersom de tillhandahålls till attributkonstruktorer som positionsparametrar. För varje obligatoriskt argument bör attributet också tillhandahålla en motsvarande skrivskyddad egenskap så att argumentets värde kan hämtas vid körningen. Attribut kan också definiera valfria argument, som även kallas namngivna argument. Dessa argument tillhandahålls till attributkonstruktorer efter namn och bör ha en motsvarande läs-/skrivegenskap. |
CA1021: Undvik parametrar | Att skicka typer efter referens (med out eller ref) kräver erfarenhet av pekare, förståelse för hur värdetyper och referenstyper skiljer sig åt och hanteringsmetoder med flera returvärden. Dessutom är skillnaden mellan ut- och referensparametrar inte allmänt förstådd. |
CA1024: Använd egenskaper där det är lämpligt | En offentlig eller skyddad metod har ett namn som börjar med "Get", tar inga parametrar och returnerar ett värde som inte är en matris. Metoden kan vara en bra kandidat för att bli en egenskap. |
CA1027: Markera uppräkningar med FlagsAttribute | En uppräkning är en värdetyp som definierar en uppsättning relaterade namngivna konstanter. Tillämpa FlagsAttribute på en uppräkning när dess namngivna konstanter kan kombineras på ett meningsfullt sätt. |
CA1028: Uppräkningslagring ska vara Int32 | En uppräkning är en värdetyp som definierar en uppsättning relaterade namngivna konstanter. Som standard används datatypen System.Int32 för att lagra konstantvärdet. Även om du kan ändra den här underliggande typen krävs eller rekommenderas den inte för de flesta scenarier. |
CA1030: Använd händelser där det är lämpligt | Den här regeln identifierar metoder som har namn som normalt används för händelser. Om en metod anropas som svar på en tydligt definierad tillståndsändring ska metoden anropas av en händelsehanterare. Objekt som anropar metoden bör generera händelser i stället för att anropa metoden direkt. |
CA1031: Fånga inte allmänna undantagstyper | Allmänna undantag bör inte fångas. Fånga ett mer specifikt undantag eller återväxa det allmänna undantaget som den sista instruktionen i catch-blocket. |
CA1032: Implementera standardfelkonstruktorer | Om det inte finns någon fullständig uppsättning konstruktorer kan det vara svårt att hantera undantag på rätt sätt. |
CA1033: Gränssnittsmetoder bör kunna anropas av underordnade typer | En oförseglat externt synlig typ ger en explicit metodimplementering av ett offentligt gränssnitt och tillhandahåller inte en alternativ externt synlig metod som har samma namn. |
CA1034: Kapslade typer bör inte vara synliga | En kapslad typ är en typ som deklareras i omfånget för en annan typ. Kapslade typer är användbara för att kapsla in information om privat implementering av den innehållande typen. Kapslade typer bör inte vara externt synliga för det här ändamålet. |
CA1036: Åsidosätt metoder för jämförbara typer | En offentlig eller skyddad typ implementerar gränssnittet System.IComparable. Den åsidosätter inte Object.Equals och överbelastar inte heller den språkspecifika operatorn för likhet, ojämlikhet, mindre än eller större än. |
CA1040: Undvik tomma gränssnitt | Gränssnitt definierar medlemmar som tillhandahåller ett beteende- eller användningskontrakt. De funktioner som beskrivs av gränssnittet kan användas av vilken typ som helst, oavsett var typen visas i arvshierarkin. En typ implementerar ett gränssnitt genom att tillhandahålla implementeringar för medlemmarna i gränssnittet. Ett tomt gränssnitt definierar inte några medlemmar. Den definierar därför inte ett kontrakt som kan genomföras. |
CA1041: Ange föråldradAttribute-meddelande | En typ eller medlem markeras med hjälp av ett System.ObsoleteAttribute-attribut som inte har angett egenskapen ObsoleteAttribute.Message. När en typ eller medlem som markeras med hjälp av ObsoleteAttribute kompileras, visas egenskapen Meddelande för attributet, vilket ger användaren information om den föråldrade typen eller medlemmen. |
CA1043: Använd integral- eller strängargument för indexerare | Indexerare (d.v.s. indexerade egenskaper) bör använda integral- eller strängtyper för indexet. Dessa typer används vanligtvis för indexering av datastrukturer och ökar bibliotekets användbarhet. Användningen av objekttypen bör begränsas till de fall där den specifika integralen eller strängtypen inte kan anges vid designtillfället. |
CA1044: Egenskaper ska inte bara skrivas | Även om det är acceptabelt och ofta nödvändigt att ha en skrivskyddad egenskap, förbjuder designriktlinjerna användning av skrivskyddade egenskaper. Det beror på att det inte ger någon säkerhet att låta en användare ange ett värde och sedan hindra användaren från att visa det värdet. Utan läsåtkomst kan inte heller tillståndet för delade objekt visas, vilket begränsar deras användbarhet. |
CA1045: Skicka inte typer efter referens | Att skicka typer efter referens (med out eller ref) kräver erfarenhet av pekare, förståelse för hur värdetyper och referenstyper skiljer sig åt och hanteringsmetoder med flera returvärden. Biblioteksarkitekter som utformar för en allmän målgrupp bör inte förvänta sig att användarna ska bli skickliga på att arbeta med parametrarna out eller ref. |
CA1046: Överlagrar inte operatorn är lika med referenstyper | För referenstyper är standardimplementeringen av likhetsoperatorn nästan alltid korrekt. Som standard är två referenser bara lika med om de pekar på samma objekt. |
CA1047: Deklarera inte skyddade medlemmar i förseglade typer | Typer deklarerar skyddade medlemmar så att ärvande typer kan komma åt eller åsidosätta medlemmen. Per definition kan inte förseglade typer ärvas, vilket innebär att skyddade metoder på förseglade typer inte kan anropas. |
CA1050: Deklarera typer i namnområden | Typer deklareras i namnområden för att förhindra namnkollisioner och som ett sätt att organisera relaterade typer i en objekthierarki. |
CA1051: Deklarera inte synliga instansfält | Den primära användningen av ett fält bör vara som en implementeringsinformation. Fälten ska vara privata eller interna och ska exponeras med hjälp av egenskaper. |
CA1052: Statiska hållare ska förseglas | En offentlig eller skyddad typ innehåller endast statiska medlemmar och deklareras inte med hjälp av den förseglade modifieraren (C#) eller NotInheritable (Visual Basic). En typ som inte är avsedd att ärvas ska markeras med hjälp av den förseglade modifieraren för att förhindra att den används som bastyp. |
CA1053: Statiska hållare ska inte ha konstruktorer | En offentlig eller kapslad offentlig typ deklarerar endast statiska medlemmar och har en offentlig eller skyddad standardkonstruktor. Konstruktorn är onödig eftersom det inte krävs någon instans av typen för att anropa statiska medlemmar. Strängöverlagringen ska anropa URI-överlagringen (uniform resource identifier) med hjälp av strängargumentet för säkerhet och säkerhet. |
CA1054: URI-parametrar bör inte vara strängar | Om en metod tar en strängrepresentation av en URI bör motsvarande överlagring tillhandahållas som tar en instans av URI-klassen, som tillhandahåller dessa tjänster på ett säkert och säkert sätt. |
CA1055: URI-returvärden ska inte vara strängar | Den här regeln förutsätter att metoden returnerar en URI. En strängrepresentation av en URI är benägen att parsa och koda fel och kan leda till säkerhetsrisker. Klassen System.Uri tillhandahåller dessa tjänster på ett säkert och säkert sätt. |
CA1056: URI-egenskaper ska inte vara strängar | Den här regeln förutsätter att egenskapen representerar en URI. En strängrepresentation av en URI är benägen att parsa och koda fel och kan leda till säkerhetsrisker. Klassen System.Uri tillhandahåller dessa tjänster på ett säkert och säkert sätt. |
CA1058: Typer bör inte utöka vissa bastyper | En externt synlig typ utökar vissa bastyper. Använd något av alternativen. |
CA1060: Flytta P/Invokes till klassen NativeMethods | Plattformsanropsmetoder, till exempel de som markerats med metoderna System.Runtime.InteropServices.DllImportAttribute eller som definierats med nyckelordet Deklarera i Visual Basic, får åtkomst till ohanterad kod. Dessa metoder bör vara av klassen NativeMethods, Valv NativeMethods eller UnsafeNativeMethods. |
CA1061: Dölj inte basklassmetoder | En metod i en bastyp döljs av en identiskt namngiven metod i en härledd typ, när parametersignaturen för den härledda metoden endast skiljer sig efter typer som är mer svagt härledda än motsvarande typer i parametersignaturen för basmetoden. |
CA1062: Verifiera argument för offentliga metoder | Alla referensargument som skickas till externt synliga metoder ska kontrolleras mot null. |
CA1063: Implementera IDisposable korrekt | Alla IDisposable-typer bör implementera mönstret Ta bort korrekt. |
CA1064: Undantag bör vara offentliga | Ett internt undantag visas endast inom det egna interna omfånget. När undantaget ligger utanför det interna omfånget kan endast basfelet användas för att fånga undantaget. Om det interna undantaget ärvs från System.Exception, System.SystemExceptioneller System.ApplicationException, har den externa koden inte tillräcklig information för att veta vad du ska göra med undantaget. |
CA1065: Skapa inte undantag på oväntade platser | En metod som inte förväntas utlösa undantag utlöser ett undantag. |
CA1066: Implementera IEquatable vid åsidosättande av lika med | En värdetyp åsidosätter Equals metoden, men implementerar IEquatable<T>inte . |
CA1067: Åsidosätt lika med när du implementerar IEquatable | En typ implementerar , men åsidosätter IEquatable<T>Equals inte metoden. |
CA1068: AnnulleringToken-parametrar måste komma sist | En metod har parametern CancellationToken som inte är den sista parametern. |
CA1069: Uppräkningar bör inte ha duplicerade värden | En uppräkning har flera medlemmar som uttryckligen tilldelas samma konstanta värde. |
CA1070: Deklarera inte händelsefält som virtuella | En fältliknande händelse deklarerades som virtuell. |
Samarbeta med oss på GitHub
Källan för det här innehållet finns på GitHub, där du även kan skapa och granska ärenden och pull-begäranden. Se vår deltagarguide för mer information.