86 votes

Est-il possible de créer constructeur-l'extension de la méthode ? comment?

Est-il possible d'ajouter un constructeur de la méthode d'extension ? Je veux ajouter une Liste< T > constructeur à recevoir un montant d'octets de donnée partiellement rempli tampon (sans les frais de copie seulement les octets et ainsi de suite):

...
public static List<T>(this List<T> l, T[] a, int n)
{
    for (int i = 0; i < n; i++)
       l.Add(a[i]);
}
...

ainsi que l'utilisation serait:

List<byte> some_list = new List<byte>(my_byte_array,number_of_bytes);

Je l'ai déjà ajouté un AddRange méthode d'extension:

public static void AddRange<T>(this List<T> l, T[] a, int n)
{
   for (int i = 0; i < n; i++)
       l.Add(a[i]);
}

Je veux le faire en tant que constructeur de trop. Est-il possible ? si oui comment faire ?

58voto

fearofawhackplanet Points 12147

Non, mais si vous avez changé d' AddRange signature à retourner la liste de l'instance, alors vous pourriez au moins faire

var list = new List<int>().AddRange(array, n);

ce qui à mon humble avis est probablement le plus clair de surcharger le constructeur de toute façon.

41voto

Eric Lippert Points 300275

SWeko la réponse est fondamentalement correcte, bien que l'article qu'il a des liens vers est à propos de l'extension de propriétés plutôt que de l'extension des constructeurs.

Nous avons également fait une conception grossière pour l'extension de constructeurs dans le même temps, comme nous l'avons fait de l'extension des propriétés; ils seraient une belle sucre syntaxique pour le modèle de fabrique. Cependant, ils n'ai jamais dépassé le stade de la conception; la fonction, bien que jolie, n'est pas vraiment nécessaire et de ne pas permettre à tout génial de nouveaux scénarios.

Si vous avez un vraiment génial problème que l'extension des constructeurs permettrait de résoudre, je serais heureux d'entendre plus de détails. Le plus du monde réel de la rétroaction que nous recevons, plus nous serons en mesure d'évaluer les mérites relatifs des centaines de suggestions de fonctionnalités nous recevons chaque année.

22voto

SWeko Points 17524

En un mot: non. Jetez un oeil à ce pour quelques explications.

Ils ont été coupés à partir de C# 3, alors qu'ils ont été coupés à partir de C# 4 liste des fonctionnalités, et nous ne pouvons qu'espérer qu'ils pourraient faire du C# 5 caractéristiques, mais je ne suis pas très optimiste.

12voto

L33TS Points 458

Je sais que c'est une bosse, je voulais simplement faire remarquer que vous pouvez hériter de la classe List et faire quelque chose comme ceci:

class List<T> : System.Collections.Generic.List<T>
    {
        public List(T[] a, int n)
            : base()
        {
                AddRange(a, n);
        }
    }

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