Metodi di estensioneExtension Methods

I metodi di estensione sono una funzionalità del linguaggio che consente ai metodi statici di essere chiamato usando la sintassi di chiamata del metodo di istanza.Extension methods are a language feature that allows static methods to be called using instance method call syntax. Questi metodi devono richiedere almeno un parametro, che rappresenta l'istanza che è il metodo su cui operare.These methods must take at least one parameter, which represents the instance the method is to operate on.

La classe che definisce i metodi di tale estensione è definita come la classe "sponsor" e deve essere dichiarata come statica.The class that defines such extension methods is referred to as the "sponsor" class, and it must be declared as static. Per usare i metodi di estensione, uno è necessario importare lo spazio dei nomi che definisce la classe di sponsor.To use extension methods, one must import the namespace defining the sponsor class.

X AVOID frivolously che definisce i metodi di estensione, in particolar modo nei tipi non si è proprietari.X AVOID frivolously defining extension methods, especially on types you don’t own.

Se si possiede il codice sorgente di un tipo, provare a utilizzare i metodi di istanza normale.If you do own source code of a type, consider using regular instance methods instead. Se non si è proprietari e si desidera aggiungere un metodo, prestare molta attenzione.If you don’t own, and you want to add a method, be very careful. Il libero utilizzo dei metodi di estensione è in grado di affollare l'API di tipi che non sono stati progettati per avere questi metodi.Liberal use of extension methods has the potential of cluttering APIs of types that were not designed to have these methods.

✓ CONSIDER utilizzando i metodi di estensione in uno dei seguenti scenari:✓ CONSIDER using extension methods in any of the following scenarios:

  • Per fornire supporto funzionalità rilevanti per ogni implementazione di un'interfaccia, se ha funzionalità possono essere scritti in termini di interfaccia principale.To provide helper functionality relevant to every implementation of an interface, if said functionality can be written in terms of the core interface. Questo avviene perché le implementazioni concrete in caso contrario, non è possibile assegnare alle interfacce.This is because concrete implementations cannot otherwise be assigned to interfaces. Ad esempio, il LINQ to Objects gli operatori vengono implementati come metodi di estensione per tutti i IEnumerable<T> tipi.For example, the LINQ to Objects operators are implemented as extension methods for all IEnumerable<T> types. Di conseguenza, qualsiasi IEnumerable<> implementazione è automaticamente abilitata per LINQ.Thus, any IEnumerable<> implementation is automatically LINQ-enabled.

  • Quando un metodo di istanza introdurrebbe una dipendenza da un tipo, ma tale dipendenza causa l'interruzione delle regole di gestione delle dipendenze.When an instance method would introduce a dependency on some type, but such a dependency would break dependency management rules. Ad esempio, una dipendenza da String a System.Uri non è auspicabile e pertanto String.ToUri() metodo di istanza restituzione System.Uri sarebbe una progettazione errata da una prospettiva di gestione delle dipendenze.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. Un metodo di estensione statico Uri.ToUri(this string str) restituzione System.Uri sarebbe una progettazione molto migliore.A static extension method Uri.ToUri(this string str) returning System.Uri would be a much better design.

X AVOID che definisce i metodi di estensione su System.Object.X AVOID defining extension methods on System.Object.

Gli utenti di Visual Basic non saranno in grado di chiamare metodi su riferimenti a oggetti usando la sintassi di metodo di estensione.VB users will not be able to call such methods on object references using the extension method syntax. Visual Basic non supporta la chiamata a metodi quali perché, in Visual Basic, dichiarare un riferimento come oggetto forza tutte le chiamate al metodo in modo da essere in ritardo associato (membro effettivo chiamato è determinata in fase di esecuzione), mentre le associazioni ai metodi di estensione vengono determinate in fase di compilazione (associazione anticipata associato).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).

Si noti che la linea guida si applica ad altri linguaggi, in cui è presente lo stesso comportamento di associazione, o in cui non sono supportati i metodi di estensione.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 inserire i metodi di estensione nello spazio dei nomi stesso come il tipo esteso a meno che non sia per l'aggiunta di metodi a interfacce o per la gestione delle dipendenze.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 che definisce due o più metodi di estensione con la stessa firma, anche se si trovano in spazi dei nomi diversi.X AVOID defining two or more extension methods with the same signature, even if they reside in different namespaces.

✓ CONSIDER che definisce i metodi di estensione nello spazio dei nomi stesso come il tipo esteso se il tipo è un'interfaccia e i metodi di estensione sono concepiti per essere utilizzate in molti o tutti i casi.✓ 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 definire metodi di estensione che implementa una funzionalità negli spazi dei nomi in genere associati con altre funzionalità.X DO NOT define extension methods implementing a feature in namespaces normally associated with other features. Al contrario, definirli nello spazio dei nomi associato alla funzionalità che a cui appartengono.Instead, define them in the namespace associated with the feature they belong to.

X AVOID generico denominazione degli spazi dei nomi dedicato ai metodi di estensione (ad esempio, "estensioni").X AVOID generic naming of namespaces dedicated to extension methods (e.g., "Extensions"). Utilizzare un nome descrittivo (ad esempio, "Routing") invece.Use a descriptive name (e.g., "Routing") instead.

Parti protette da copyright © 2005, 2009 Microsoft Corporation. Tutti i diritti riservati.Portions © 2005, 2009 Microsoft Corporation. All rights reserved.

Ristampato con l'autorizzazione di Pearson Education, Inc. dal linee guida di progettazione di Framework: Convenzioni, linguaggi e modelli per le librerie .NET di riutilizzabile, 2nd Edition Krzysztof Cwalina e Brad Abrams, pubblicato il 22 ottobre 2008 da Addison-Wesley Professional come parte della serie di sviluppo di Microsoft Windows.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.

Vedere ancheSee also