Delen via


Eigenschappenontwerp

Notitie

Deze inhoud wordt opnieuw afgedrukt door toestemming van Pearson Education, Inc. van Framework Design Guidelines: Conventions, Idioms en Patterns for Reusable .NET Libraries, 2nd Edition. Die editie werd in 2008 gepubliceerd en het boek is sindsdien volledig herzien in de derde editie. Sommige informatie op deze pagina is mogelijk verouderd.

Hoewel eigenschappen technisch erg vergelijkbaar zijn met methoden, zijn ze vrij verschillend in termen van hun gebruiksscenario's. Ze moeten worden gezien als slimme velden. Ze hebben de aanroepende syntaxis van velden en de flexibiliteit van methoden.

✔️ MAAK alleen-ophalen-eigenschappen als de aanroeper de waarde van de eigenschap niet mag wijzigen.

Houd er rekening mee dat als het type eigenschap een onveranderbaar verwijzingstype is, de eigenschapswaarde kan worden gewijzigd, zelfs als de eigenschap alleen-ophalen is.

❌ GEEF GEEN eigenschappen of eigenschappen met alleen-instellingen met de setter met een bredere toegankelijkheid dan de getter.

Gebruik bijvoorbeeld geen eigenschappen met een openbare setter en een beveiligde getter.

Als de eigenschap getter niet kan worden opgegeven, implementeert u in plaats daarvan de functionaliteit als een methode. Overweeg om de naam van de methode te starten met Set en te volgen met wat u de eigenschap zou hebben genoemd. Heeft bijvoorbeeld AppDomain een methode die wordt aangeroepen SetCachePath in plaats van dat er een eigenschap met alleen-set wordt aangeroepen CachePath.

✔️ DO bieden verstandige standaardwaarden voor alle eigenschappen, zodat de standaardwaarden niet resulteren in een beveiligingsgat of vreselijk inefficiënte code.

✔️ WEL toestaan dat eigenschappen in een willekeurige volgorde worden ingesteld, zelfs als dit resulteert in een tijdelijke ongeldige status van het object.

Het is gebruikelijk dat twee of meer eigenschappen zijn gerelateerd aan een punt waar sommige waarden van de ene eigenschap ongeldig kunnen zijn gezien de waarden van andere eigenschappen in hetzelfde object. In dergelijke gevallen moeten uitzonderingen die voortvloeien uit de ongeldige status worden uitgesteld totdat de onderling gerelateerde eigenschappen daadwerkelijk door het object worden gebruikt.

✔️ Bewaar de vorige waarde als een eigenschapssetter een uitzondering genereert.

❌ VERMIJD het genereren van uitzonderingen van eigenschaps getters.

Eigenschappen getters moeten eenvoudige bewerkingen zijn en mogen geen voorwaarden hebben. Als een getter een uitzondering kan genereren, moet deze waarschijnlijk opnieuw worden ontworpen om een methode te zijn. U ziet dat deze regel niet van toepassing is op indexeerfuncties, waarbij we uitzonderingen verwachten als gevolg van het valideren van de argumenten.

Geïndexeerd eigenschapsontwerp

Een geïndexeerde eigenschap is een speciale eigenschap die parameters kan bevatten en kan worden aangeroepen met speciale syntaxis die vergelijkbaar is met matrixindexering.

Geïndexeerde eigenschappen worden meestal indexeerfuncties genoemd. Indexeerfuncties mogen alleen worden gebruikt in API's die toegang bieden tot items in een logische verzameling. Een tekenreeks is bijvoorbeeld een verzameling tekens en de indexeerfunctie System.String is toegevoegd om toegang te krijgen tot de tekens.

✔️ OVERWEEG het gebruik van indexeerfuncties om toegang te bieden tot gegevens die zijn opgeslagen in een interne matrix.

✔️ OVERWEEG indexeerfuncties op te geven voor typen die verzamelingen items vertegenwoordigen.

❌ VERMIJD het gebruik van geïndexeerde eigenschappen met meer dan één parameter.

Als voor het ontwerp meerdere parameters zijn vereist, moet u bedenken of de eigenschap echt een toegangselement voor een logische verzameling vertegenwoordigt. Als dat niet het geval is, gebruikt u in plaats daarvan methoden. Overweeg de naam van de methode te starten met Get of Set.

❌ VERMIJD indexeerfuncties met andere parametertypen dan System.Int32, System.Int64, System.String, of System.Objecteen opsomming.

Als voor het ontwerp andere typen parameters zijn vereist, evalueert u ten zeerste of de API echt een accessor voor een logische verzameling vertegenwoordigt. Als dat niet het geval is, gebruikt u een methode. Overweeg de naam van de methode te starten met Get of Set.

✔️ Gebruik de naam Item voor geïndexeerde eigenschappen, tenzij er een duidelijk betere naam is (zie bijvoorbeeld de Chars[] eigenschap op System.String).

In C# worden indexeerfuncties standaard item genoemd. De IndexerNameAttribute naam kan worden gebruikt om deze naam aan te passen.

❌ GEEF NIET zowel een indexeerfunctie als methoden die semantisch gelijkwaardig zijn.

❌ ZORG NIET voor meer dan één familie overbelaste indexeerfuncties in één type.

Dit wordt afgedwongen door de C#-compiler.

❌ GEBRUIK GEEN niet-standaard geïndexeerde eigenschappen.

Dit wordt afgedwongen door de C#-compiler.

Meldingsevenementen voor eigenschapswijziging

Soms is het handig om een gebeurtenis op te geven die de gebruiker op de hoogte stelt van wijzigingen in een eigenschapswaarde. Hiermee wordt bijvoorbeeld System.Windows.Forms.Control een TextChanged gebeurtenis gegenereerd nadat de waarde van Text de eigenschap is gewijzigd.

✔️ OVERWEEG wijzigingenmeldingsgebeurtenissen op te geven wanneer eigenschapswaarden in API's op hoog niveau (meestal ontwerponderdelen) worden gewijzigd.

Als er een goed scenario is voor een gebruiker om te weten wanneer een eigenschap van een object wordt gewijzigd, moet het object een wijzigingsmeldings gebeurtenis voor de eigenschap genereren.

Het is echter onwaarschijnlijk dat de overhead de moeite waard is om dergelijke gebeurtenissen te genereren voor API's op laag niveau, zoals basistypen of verzamelingen. Zou dergelijke gebeurtenissen bijvoorbeeld List<T> niet genereren wanneer een nieuw item wordt toegevoegd aan de lijst en de Count eigenschap wordt gewijzigd.

✔️ OVERWEEG wijzigingenmeldingen te genereren wanneer de waarde van een eigenschap verandert via externe krachten.

Als een eigenschapswaarde verandert via een externe kracht (op een andere manier dan door methoden voor het object aan te roepen), geeft u gebeurtenissen aan aan de ontwikkelaar dat de waarde wordt gewijzigd en is gewijzigd. Een goed voorbeeld is de Text eigenschap van een tekstvakbesturingselement. Wanneer de gebruiker tekst in een TextBoxtypt, wordt de eigenschapswaarde automatisch gewijzigd.

© Delen 2005, 2009 Microsoft Corporation. Alle rechten voorbehouden.

Herdrukt door toestemming van Pearson Education, Inc. van Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, published oct 22, 2008 by Addison-Wesley Professional als onderdeel van de Microsoft Windows Development Series.

Zie ook