85 votes

Quels avantages des méthodes d’Extension avez-vous trouvé ?

Un "non-croyant" de C# a été de me demander quel est le but de méthodes d'extension a été. J'ai expliqué que vous pouvez ensuite ajouter de nouvelles méthodes pour les objets qui ont été déjà définis, en particulier lorsque vous n'avez pas/contrôle de la source à l'objet d'origine.

Il a évoqué "Pourquoi ne pas simplement ajouter une méthode à votre propre classe?" Nous avons été va rond et rond (dans le bon sens). Ma réponse est qu'il est un autre outil dans la toolbelt, et sa réponse est qu'il est un inutile gaspillage d'un outil... mais j'ai pensé que j'allais avoir un plus "éclairés" réponse.

Quels sont les scénarios que vous avez utilisé les méthodes d'extension que vous ne pouvait pas (ou ne devrait pas) ont utilisé une méthode ajoutée à votre propre classe?

84voto

Andrew Hare Points 159332

Le seul avantage des méthodes d'extension est la lisibilité du code. C'est tout.

Les méthodes d'Extension vous permettent de faire cela:

foo.bar();

au lieu de cela:

Util.bar(foo);

Maintenant il y a beaucoup de choses en C# qui sont comme ça. En d'autres termes il y a beaucoup de fonctions en C# qui semblent anodins et ne pas avoir un grand avantage pour eux-mêmes. Cependant, une fois que vous commencer la combinaison de ces caractéristiques, ensemble, vous commencez à voir quelque chose de juste un peu plus grand que la somme de ses parties. LINQ profite grandement des méthodes d'extension comme les requêtes LINQ serait presque illisible sans eux. LINQ serait possible sans les méthodes d'extension, mais pas pratique.

Les méthodes d'Extension sont un peu comme C#'s des classes partielles. Par eux-mêmes, ils ne sont pas très utiles et qui semble trivial. Mais quand vous commencez à travailler avec une classe qui a besoin de code généré, classes partielles commencer à faire beaucoup plus de sens.

35voto

Eduardo Campañó Points 4801

Je pense que les méthodes d’extension d’une grande aident lorsque vous écrivez du code, si vous ajoutez des méthodes d’extension pour les types de base que vous les aurez quicky dans l’intellisense.

J’ai un fournisseur de format pour une taille de fichier de format. Pour l’utiliser, j’ai besoin d’écrire :

Création d’une méthode d’extension, je peux écrire :

Plus propre et plus simple.

34voto

Brian Points 82719

N’oubliez pas outillage ! Lorsque vous ajoutez une méthode d’extension M type Foo, vous obtenez suis ' dans la liste intellisense de Foo (en supposant que la classe d’extension est dans la portée). Suis ce rend "beaucoup plus facile à trouver que MyClass.M(Foo,...).

À la fin de la journée, c’est juste syntaxique d’ailleurs--les méthodes statiques, mais comme l’achat d’une maison : « emplacement, emplacement, emplacement ! » Si il se bloque sur le type, les gens vont le trouver !

29voto

David Alpert Points 2305

Deux autres avantages de l'extension des méthodes que j'ai rencontré:

  • une interface fluide peut être encapsulé dans une classe statique des méthodes d'extension, et atteindre ainsi une séparation des préoccupations entre la classe de base et il est couramment extensions; j'ai vu que parvenir à une plus grande maintenabilité
  • les méthodes d'extension peut être suspendue d'interfaces, vous permettant de spécifier un contrat (via l'interface) et associé à une série de l'interface basée sur les comportements (via les méthodes d'extension), offre à nouveau une séparation des préoccupations.

27voto

Jon Limjap Points 46429

Certaines des meilleures utilisations que j'ai eu pour les méthodes d'extension, c'est la capacité à:

  1. D'étendre les fonctionnalités d'un tiers, les objets (qu'elle soit commerciale ou interne à mon entreprise, mais sont gérés par un groupe distinct), qui dans de nombreux cas sera marqué comme sealed.
  2. Créer des fonctionnalités par défaut pour l'interface sans avoir à mettre en œuvre une classe abstraite

Prenons, par exemple, IEnumerable<T>. Alors qu'il est riche en méthodes d'extension, je l'ai trouvé ennuyeux que de ne pas mettre en œuvre un générique ForEach méthode. Donc, j'ai fait mon propre:

public void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
{
    foreach ( var o in enumerable )
    {
        action(o);
    }
}

Voila, toute ma IEnumerable<T> objets indépendamment de leur type d'implémentation, et si oui ou non je l'ai écrit, ou quelqu'un d'autre l'a fait maintenant ont un ForEach méthode par l'ajout d'une "aide" énoncé dans mon code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X