56 votes

Pourquoi ne pas en C# static de la classe des méthodes d'extension pris en charge?

Je sais à partir de cette question que les méthodes d'extension ne peut fonctionner que sur les instances de classe, pas la statique de la classe elle-même. Cela signifie que je ne peux pas étendre utile statique des classes comme l' Convert et Math.

Ce que je veux savoir, c'est, pourquoi est-ce le cas? À partir du lien ci-dessus, il ya quelques suggestions sur la façon dont l'équipe C# pourrait avoir mis en place ce type de fonctionnalité. Est-il une raison philosophique pourquoi il n'est pas pris en charge?

Pour exemple, voici un raisonnement derrière pourquoi il n'est pas intégré dans LINQ ForEach<T> extension pour IEnumerable<T>.

73voto

Eric Lippert Points 300275

l'équipe C# pourrait avoir mis en place ce type de fonctionnalité. Est-il une raison philosophique pourquoi il n'est pas pris en charge?

Il n'y a pas de raison technique, et pas de la raison philosophique. Cependant, comme je l'ai souvent remarquer, je n'ai pas à fournir une justification pour ne pas faire une fonction. Les fonctionnalités ne sont pas bon marché; ils sont extrêmement coûteux et non seulement ils doivent justifier leurs frais, ils doivent justifier le coût d'opportunité de ne pas faire les centaines d'autres fonctionnalités que nous avons pu avoir fini avec ce budget. Nous devons justifier le coût de fonctionnalités pour nos parties prenantes, mais nous n'avons pas besoin de justifier d'économie de temps et d'efforts par la non mise en œuvre des fonctionnalités qui ne sont pas conformes à notre bar.

En particulier, le projet de fonctionnalité ne fait rien pour LINQ; les méthodes d'extension ont été ajoutées pour rendre LINQ travail. Tout ce qui n'a pas LINQ est un travail très difficile à obtenir en C# 3.0; nous avons eu beaucoup de travail sur le calendrier et pas beaucoup de temps pour le faire. (J'ai été surpris de voir que automatique des propriétés de rendu.) La coupe d'un inutile avant même la conception de, elle a sauvé beaucoup de temps et d'effort a été consacré à d'autres choses qui ne font LINQ travail.

En bref: les fonctionnalité n'a jamais rencontré notre bar pour avantage net par rapport au coût, et nous avons toujours eu des caractéristiques les plus importantes de passer notre temps limité et de l'effort.

13voto

Justin Morgan Points 1828

Après avoir lu les réponses, ainsi que des questions connexes, j'ai assemblé ma compréhension de la question ici.

Comment l'extension des méthodes de travail

Tout d'abord, il est important de réaliser que les extensions sont tout sucre syntaxique pour les méthodes statiques.

// Say you have an extension method that looks like this:
class Extensions
{
    public static void Extend(this SomeClass foo) {}
}

// Here's how you call it
SomeClass myClass;
myClass.Extend();

// The compiler converts it to this:
Extensions.Extend(myClass);

La méthode n'est pas réellement devenir une partie de la classe. C'est pourquoi vous ne pouvez pas accéder aux membres privés d'une méthode d'extension. Les méthodes d'Extension de changer la syntaxe C# uniquement, et ne violent pas le concept de la programmation orientée objet à l'accessibilité. En fait, si vous écrivez une méthode d'extension et d ' une méthode statique qui font la même chose, alors décompiler le MSIL, ils sont exactement la même.

Pourquoi les méthodes d'extension existent

Donc, si elles ne pas ajouter de la fonctionnalité réelle, pourquoi les méthodes d'extension à tous? La réponse est LINQ:

// LINQ makes this easy to read
array.Where(i => i&1 == 0).Select(i => i*i);

// Without extension methods, we would have to do it like this
Enumerable.Select(Enumerable.Where(array, i => i&1 == 0), i => i*i);

En un sens, tous LINQ est juste sucre syntaxique, puisque tout ce qu'il peut faire, peut être écrite dans un maladroit, non LINQy. Évidemment, l'équipe C#, estimé que la lisibilité acquise par LINQ en valait la peine, mais il pose la question, "pourquoi ont-ils arrêter là?"

Pourquoi pas d'autres types d'extension?

Eric Lippert, un de le compilateur C# devs, décrit dans un billet de blog qu'une énorme partie de C# 3 a été la création de toutes les constructions nécessaires pour LINQ: "implicitement tapé les habitants, les types anonymes, des expressions lambda, les méthodes d'extension, de l'objet et des initialiseurs de la collection, à la requête des compréhensions, des arbres d'expression, [et] l'amélioration de la méthode d'inférence de type." Parce que le C# de l'équipe a été au mieux les ressources limitées de l'équipe pour la 2008 .NET de presse, d'autres types d'extensions qui n'étaient pas strictement nécessaire pour LINQ n'ont pas été inclus.

L'équipe a examiné la mise en œuvre de l'extension de propriétés en C# 4, et a effectivement écrit un prototype de travail, mais il a été abandonné quand ils ont découvert qu'il ne permettrait pas à la WPF équipe de mise en œuvre (qui a été un des facteurs de motivation pour la fonction). Eric Lipper a dit plus tard qu'ils ont tenu compte des méthodes d'extension pour les classes statiques, mais ne pouvait pas justifier les avantages réels par rapport aux coûts de mise en œuvre, les tests et la maintenance.

Une solution de contournement

Il est possible d'écrire une méthode d'extension qui se rapproche:

public static TResult DoSomething<TType, TResult>(this TType @class)
    {
        // access static methods with System.Reflection
        return default(TResult);
    }

// This works, but poorly
typeof(Math).DoSomething();
typeof(Convert).DoSomething();

Mais c'est assez laid. Il nécessite de la réflexion, et ne peut pas supporter de frappe intelligente, puisque tout Type pouvez l'appeler comme ça et c'est probablement pas la fonctionnalité voulue.

3voto

kelloti Points 4157

Les méthodes d'Extension opèrent sur des objets, et non des classes. Si vous voulez une méthode d'extension pour fonctionner sur une classe, je suppose que vous pourriez faire ceci:

public static T DoSomething<T>(this T @class) 
    where T:Type
{
    // access static methods via reflection...
    return @class;
}

3voto

Snowbear Points 10826

Je crois que la réponse à votre question est - because it doesn't make any sense to extend with static methods. La raison principale derrière l'introduction de Extension methods n'est extending de la classe qui ne vous appartient pas. La raison principale est qu'il permettra de réduire les méthodes de nidification dans des exemples comme ceux-ci:

 Enumerable.Select(Enumerable.Where(arr, i => i & 1 == 0), i => i*i); // not the best thing I ever read

 arr.Where(i => i&1 == 0).Select(i => i*i); // wow, I see! These are squares for odd numbers

C'est pourquoi il n'y a pas de point à avoir extension méthodes pour les classes statiques.

1voto

Akash Kava Points 18026

Eh bien ce n'est pas seulement à propos de ne pas implémenté, mais il va causer de la confusion d'où la méthode appartient? Statique des extensions ont été introduits en raison de linq est venu en version ultérieure et que pour aider linq dans facile à coder de manière statique les extensions sont utiles.

Statique extensions ne sont utiles que pour rendre le code plus lisible. Il n'a pas de signification au moment de l'exécution ou de la compilation.

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