web-dev-qa-db-fra.com

Est-il possible de créer une méthode d'extension constructeur? Comment?

Est-il possible d'ajouter une méthode d'extension constructeur? Je veux ajouter un constructeur List <T> pour recevoir une quantité spécifique d'octets à partir d'un tampon partiellement rempli donné (sans la surcharge de copier uniquement les octets pertinents 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]);
}
...

donc l'utilisation serait:

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

J'ai déjà ajouté une méthode d'extension AddRange:

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 aussi le faire en tant que constructeur. C'est possible ? si oui - comment?

73
Tar

Non, mais si vous avez modifié votre signature AddRange pour renvoyer l'instance de liste, vous pourriez au moins faire

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

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

52
fearofawhackplanet

La réponse de SWeko est fondamentalement correcte, bien que l'article auquel il renvoie concerne les propriétés d'extension plutôt que les constructeurs d'extension.

Nous avons également fait une conception approximative pour les constructeurs d'extension en même temps que nous avons fait les propriétés d'extension; ce serait un bon sucre syntaxique pour le modèle d'usine. Cependant, ils n'ont jamais dépassé la phase de conception; la fonctionnalité, bien que Nice, n'est pas vraiment nécessaire et ne permet pas de nouveaux scénarios impressionnants.

Si vous avez un problème vraiment génial que les constructeurs d'extensions pourraient résoudre, je serais heureux d'entendre plus de détails. Plus nous recevons de commentaires du monde réel, mieux nous sommes en mesure d'évaluer les mérites relatifs des centaines de suggestions de fonctionnalités différentes que nous recevons chaque année.

35
Eric Lippert

En un mot - non. Jetez un oeil à this pour quelques explications.

Ils ont été coupés de la liste des fonctionnalités C # 3, puis ils ont été coupés de la liste des fonctionnalités C # 4, et nous ne pouvons qu'espérer qu'ils pourraient faire les fonctionnalités C # 5, mais je ne suis pas très optimiste.

20
SWeko

Je sais que c'est une bosse, je voulais juste souligner 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);
        }
    }
11
Bauss