¿Es posible crear el método constructor-extension? ¿Cómo?


¿ Es posible agregar un método de extensión constructor ? Quiero agregar un constructor List para recibir una cantidad específica de bytes de un búfer parcialmente llenado dado (sin la sobrecarga de copiar solo los bytes relevantes, etc.):

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

Así que el uso sería:

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

Ya he agregado un método de extensión 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]);
}

También quiero hacerlo como constructor. Es posible ? en caso afirmativo, ¿cómo ?

Author: Tar, 2011-01-24

4 answers

No, pero si cambiaste tu AddRange firma para devolver la instancia de lista, entonces podrías al menos hacer

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

Que imho es probablemente más claro que sobrecargar el constructor de todos modos.

 48
Author: fearofawhackplanet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-24 12:52:52

La respuesta de SWeko es básicamente correcta, aunque por supuesto el artículo al que enlaza es sobre propiedades de extensión en lugar de constructores de extensión.

También hicimos un diseño aproximado para los constructores de extensiones al mismo tiempo que hicimos las propiedades de extensión; serían un buen azúcar sintáctico para el patrón de fábrica. Sin embargo, nunca pasaron la etapa de diseño; la característica, aunque agradable, no es realmente necesaria y no permite ningún nuevo escenario impresionante.

Si tiene una realmente impresionante problema que los constructores de extensión resolverían, me encantaría escuchar más detalles. Cuantos más comentarios del mundo real obtengamos, mejor podremos evaluar los méritos relativos de los cientos de sugerencias de características diferentes que recibimos cada año.

 29
Author: Eric Lippert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-24 16:07:46

En una palabra-no. Echa un vistazo a este para alguna explicación.

Fueron cortadas de la lista de características de C# 3, luego fueron cortadas de la lista de características de C# 4, y solo podemos esperar que puedan hacer las características de C# 5, pero no soy muy optimista.

 20
Author: SWeko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-24 12:45:11

Sé que esto es un bache, solo quería señalar que puede heredar la clase List y hacer algo como esto:

class List<T> : System.Collections.Generic.List<T>
    {
        public List(T[] a, int n)
            : base()
        {
                AddRange(a, n);
        }
    }
 8
Author: Bauss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-16 23:16:16