Sdílet prostřednictvím


Návrh vlastnosti

Poznámka:

Tento obsah je znovu vytištěn oprávněním Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms a Patterns for Reusable .NET Libraries, 2. vydání. Tato edice byla publikována v roce 2008 a kniha byla od té doby plně upravena ve třetím vydání. Některé informace na této stránce můžou být zastaralé.

I když jsou vlastnosti technicky velmi podobné metodám, jsou poměrně odlišné z hlediska jejich scénářů použití. Měla by být považována za inteligentní pole. Mají volání syntaxe polí a flexibilitu metod.

✔️ Vlastnosti get-only vytvořit, pokud volající by neměl být schopen změnit hodnotu vlastnosti.

Mějte na paměti, že pokud je typ vlastnosti proměnlivým referenčním typem, lze hodnotu vlastnosti změnit i v případě, že je vlastnost pouze get-only.

❌ NEPOSKYTUJTE vlastnosti nebo vlastnosti jen pro nastavení s širší přístupností než getter.

Nepoužívejte například vlastnosti s veřejnou setter a chráněným getterem.

Pokud metodu getter nelze poskytnout, implementujte místo toho funkci jako metodu. Zvažte spuštění názvu Set metody a postupujte podle toho, co byste pojmenovali vlastnost. Například má metodu volanou SetCachePath místo toho, AppDomain aby byla volána CachePathvlastnost pouze set .

✔️ POSKYTNĚTE rozumné výchozí hodnoty pro všechny vlastnosti, čímž zajistíte, že výchozí hodnoty nebudou mít za následek bezpečnostní díru nebo strašně neefektivní kód.

✔️ DO allow properties to be set in any order even if this results in a temporary invalid state of the object.

Je běžné, že dvě nebo více vlastností souvisí s bodem, kdy některé hodnoty jedné vlastnosti mohou být neplatné vzhledem k hodnotám jiných vlastností ve stejném objektu. V takových případech by měly být výjimky vyplývající z neplatného stavu odloženy, dokud objekt ve skutečnosti nepoužívá vzájemně propojené vlastnosti.

✔️ Zachovat předchozí hodnotu, pokud setter vlastnosti vyvolá výjimku.

❌ Vyhněte se vyvolání výjimek z getter vlastností.

Gettery vlastností by měly být jednoduché operace a neměly by mít žádné předpoklady. Pokud getter může vyvolat výjimku, měla by být pravděpodobně přepracovaná tak, aby byla metoda. Všimněte si, že toto pravidlo se nevztahuje na indexery, kdy očekáváme výjimky v důsledku ověřování argumentů.

Návrh indexované vlastnosti

Indexovaná vlastnost je speciální vlastnost, která může mít parametry a lze ji volat se speciální syntaxí podobnou indexování pole.

Indexované vlastnosti se běžně označují jako indexery. Indexery by se měly používat jenom v rozhraních API, která poskytují přístup k položkám v logické kolekci. Například řetězec je kolekce znaků a indexer byl System.String přidán pro přístup ke svým znakům.

✔️ ZVAŽTE použití indexerů k poskytování přístupu k datům uloženým v interním poli.

✔️ ZVAŽTE poskytnutí indexerů u typů představujících kolekce položek.

❌ Nepoužívejte indexované vlastnosti s více než jedním parametrem.

Pokud návrh vyžaduje více parametrů, znovu zvažte, zda vlastnost skutečně představuje přístup k logické kolekci. Pokud ne, použijte místo toho metody. Zvažte spuštění názvu metody s Get nebo Set.

❌ Vyhněte se indexerům s jinými typy parametrů než System.Int32, System.Int64, System.String, System.Objectnebo výčtem.

Pokud návrh vyžaduje jiné typy parametrů, důrazně přehodnotit, zda rozhraní API skutečně představuje přístup k logické kolekci. Pokud ne, použijte metodu. Zvažte spuštění názvu metody s Get nebo Set.

✔️ Použijte název Item pro indexované vlastnosti, pokud není zřejmě lepší název (např. viz Chars[] vlastnost ).System.String

V jazyce C# jsou indexery ve výchozím nastavení pojmenované Položka. Tento IndexerNameAttribute název lze přizpůsobit.

❌ DO NOT neposkytuje indexer i metody, které jsou sémanticky ekvivalentní.

❌ DO NOT poskytnout více než jednu řadu přetížených indexerů v jednom typu.

To vynucuje kompilátor jazyka C#.

❌ NEPOUŽÍVEJTE nedefault indexované vlastnosti.

To vynucuje kompilátor jazyka C#.

Události oznámení o změně vlastnosti

Někdy je užitečné poskytnout událost upozorňování uživatele na změny v hodnotě vlastnosti. Například System.Windows.Forms.Control vyvolá TextChanged událost po změně hodnoty jeho Text vlastnosti.

✔️ ZVAŽTE vyvolání událostí oznámení o změnách, pokud jsou změněny hodnoty vlastností v rozhraních API vysoké úrovně (obvykle komponenty návrháře).

Pokud je pro uživatele vhodný scénář, aby věděl, kdy se vlastnost objektu mění, měl by objekt vyvolat událost oznámení o změně vlastnosti.

Není však pravděpodobné, že by se za režii za zvýšení takových událostí pro rozhraní API nízké úrovně, jako jsou základní typy nebo kolekce, hodily. Například by takové události nevyvolá při List<T> přidání nové položky do seznamu a Count změny vlastnosti.

✔️ ZVAŽTE vyvolání událostí oznámení o změnách, když se hodnota vlastnosti změní prostřednictvím externích sil.

Pokud se hodnota vlastnosti změní prostřednictvím nějaké externí síly (jiným způsobem než voláním metod u objektu), vyvolá události indikují vývojáři, že se hodnota mění a změnila. Dobrým příkladem je Text vlastnost ovládacího prvku textového pole. Když uživatel zadá text do objektu TextBox, hodnota vlastnosti se automaticky změní.

© Části 2005, 2009 Microsoft Corporation. Všechna práva vyhrazena.

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, published Oct 22, 2008 by Addison-Wesley Professional v rámci Microsoft Windows Development Series.

Viz také