Metody rozšířeníExtension Methods

Rozšiřující metody jsou jazyk funkce, která umožňuje statické metody, která se má volat pomocí syntaxe volání metody instance.Extension methods are a language feature that allows static methods to be called using instance method call syntax. Tyto metody musí přijmout nejmíň jeden parametr, který představuje instanci, kterou metoda se má operace provést.These methods must take at least one parameter, which represents the instance the method is to operate on.

Třídy, která definuje tyto rozšiřující metody jsou označovány jako "sponzor" třídy a musí být deklarován jako statické.The class that defines such extension methods is referred to as the "sponsor" class, and it must be declared as static. Chcete-li použít rozšiřující metody, jeden musí importujte obor názvů definování třídy sponzor.To use extension methods, one must import the namespace defining the sponsor class.

X AVOID frivolously definování rozšiřující metody, hlavně na typech nevlastníte.X AVOID frivolously defining extension methods, especially on types you don’t own.

Pokud vlastníte zdrojový kód typu, zvažte použití metody normální instanci aplikace.If you do own source code of a type, consider using regular instance methods instead. Pokud nevlastníte, a je třeba přidat metodu, buďte velmi opatrní.If you don’t own, and you want to add a method, be very careful. Liberální použití metody rozšíření se dá potenciálně nebudou zbytečně zabírat rozhraní API typů, které nebyly navrženy tak, aby tyto metody.Liberal use of extension methods has the potential of cluttering APIs of types that were not designed to have these methods.

✓ CONSIDER metodami rozšíření v některém z následujících scénářů:✓ CONSIDER using extension methods in any of the following scenarios:

  • K poskytují pomocná funkce, které jsou relevantní pro každou implementaci rozhraní, pokud se říká, že funkce může být napsán z hlediska základní rozhraní.To provide helper functionality relevant to every implementation of an interface, if said functionality can be written in terms of the core interface. Je to proto, že konkrétní implementace nelze přiřadit jinak rozhraní.This is because concrete implementations cannot otherwise be assigned to interfaces. Například LINQ to Objects operátory jsou implementovány jako rozšiřující metody pro všechny IEnumerable<T> typy.For example, the LINQ to Objects operators are implemented as extension methods for all IEnumerable<T> types. Díky tomu se některé IEnumerable<> implementace je automaticky povolen LINQ.Thus, any IEnumerable<> implementation is automatically LINQ-enabled.

  • Pokud by metodu instance zavést závislost na nějaký typ, ale tato závislost by narušil pravidla správy závislostí.When an instance method would introduce a dependency on some type, but such a dependency would break dependency management rules. Například závislost z String k System.Uri je pravděpodobně není žádoucí a proto String.ToUri() chybí metoda instance System.Uri by chybný návrhu z hlediska správy závislostí.For example, a dependency from String to System.Uri is probably not desirable, and so String.ToUri() instance method returning System.Uri would be the wrong design from a dependency management perspective. Metoda statické rozšíření Uri.ToUri(this string str) vrácení System.Uri by mnohem lepší návrh.A static extension method Uri.ToUri(this string str) returning System.Uri would be a much better design.

X AVOID definování rozšiřující metody na System.Object.X AVOID defining extension methods on System.Object.

VB uživatelé nebudou moct volat tyto metody pro odkazy na objekty pomocí syntaxe metody rozšíření.VB users will not be able to call such methods on object references using the extension method syntax. VB nepodporuje volání těchto metod, protože deklarace odkazu jako objekt vynutí všechna volání metod na něm nestíháte vázán v jazyce Visual Basic, (skutečný člen s názvem je určeno za běhu), zatímco vazby na metody rozšíření jsou určeny při kompilaci (již v rané fázi ven).VB does not support calling such methods because, in VB, declaring a reference as Object forces all method invocations on it to be late bound (actual member called is determined at runtime), while bindings to extension methods are determined at compile-time (early bound).

Všimněte si, že pravidlo platí do jiných jazyků, kde je k dispozici stejné chování vazby nebo pokud rozšíření metody nejsou podporovány.Note that the guideline applies to other languages where the same binding behavior is present, or where extension methods are not supported.

X DO NOT umístění rozšiřujících metod v jako typ rozšířené o stejný obor názvů, pokud je pro přidání metody do rozhraní nebo správě závislosti.X DO NOT put extension methods in the same namespace as the extended type unless it is for adding methods to interfaces or for dependency management.

X AVOID definování dvě nebo více metod rozšíření se stejným podpisem, i v případě, že jsou umístěny v různých oborech názvů.X AVOID defining two or more extension methods with the same signature, even if they reside in different namespaces.

✓ CONSIDER definování rozšiřující metody v jako typ rozšířené o stejný obor názvů, pokud typ je rozhraní, a pokud rozšiřující metody jsou určené pro použití ve většině nebo všem případů.✓ CONSIDER defining extension methods in the same namespace as the extended type if the type is an interface and if the extension methods are meant to be used in most or all cases.

X DO NOT definovat rozšiřující metody, které implementují funkce v obory názvů, které jsou obvykle spojené s jinými funkcemi.X DO NOT define extension methods implementing a feature in namespaces normally associated with other features. Místo toho je definujte v přidružené k této funkci, ke které patří do oboru názvů.Instead, define them in the namespace associated with the feature they belong to.

X AVOID obecné názvy oborů názvů vyhrazený pro metody rozšíření (například "rozšíření").X AVOID generic naming of namespaces dedicated to extension methods (e.g., "Extensions"). Použijte popisný název (například "směrování") místo toho.Use a descriptive name (e.g., "Routing") instead.

Portions © 2005, 2009 Microsoft Corporation. Všechna práva vyhrazena.Portions © 2005, 2009 Microsoft Corporation. All rights reserved.

Přetištěno podle oprávnění Pearson vzdělávání, Inc. z pokyny k návrhu architektury: Konvence, Idiomy a vzory pro opakovaně použitelného knihovny .NET, 2nd Edition Krzysztof Cwalina a Brad Abrams publikován 22 Oct 2008, Designing Effective části této série Microsoft Windows Development.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 as part of the Microsoft Windows Development Series.

Viz také:See also