Можно ли создать конструктор-расширение-метод? как?


можно ли добавить метод расширения конструктор ? Я хочу добавить конструктор List для получения определенного количества байтов из заданного частично заполненного буфера (без накладных расходов на копирование только соответствующих байтов и т. д.):

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

Так что использование будет:

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

Я уже добавил метод расширения 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]);
}

Я тоже хочу сделать это как конструктор. Возможно ли это ? если да-то как ?

4 63

4 ответа:

нет, но если вы изменили свой AddRange подпись для возврата экземпляра списка, то вы могли бы по крайней мере сделать

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

который imho, вероятно, яснее, чем перегрузка конструктора в любом случае.

ответ СВЕКО в основном правильный, хотя, конечно, статья, на которую он ссылается, касается свойств расширения, а не конструкторов расширения.

мы также сделали грубый дизайн для конструкторов расширения в то же время, что и свойства расширения; они были бы хорошим синтаксическим сахаром для заводского шаблона. Тем не менее, они никогда не проходили стадию проектирования; функция, хотя и приятная, на самом деле не нужна и не позволяет создавать новые потрясающие сценарии.

Если у вас есть действительно удивительная проблема, которую решат конструкторы расширений, я был бы рад услышать больше деталей. Чем больше реальных отзывов мы получаем, тем лучше мы можем оценить относительные достоинства сотен различных предложений функций, которые мы получаем каждый год.

одним словом - нет. Взгляните на этой для некоторого объяснения.

Они были вырезаны из списка функций C# 3, затем они были вырезаны из списка функций C# 4, и мы можем только надеяться, что они смогут сделать функции C# 5, но я не очень оптимистичен.

Я знаю, что это удар, просто хотел отметить, что вы можете наследовать класс List и сделать что-то вроде этого:

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