Можно ли создать конструктор-метод расширения? как?
Можно ли добавить метод расширения конструктора? Я хочу добавить список <T> для получения определенного количества байтов из заданного частично заполненного буфера (без накладных расходов на копирование только соответствующих байтов и т.д.):
...
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]);
}
Я хочу сделать это как конструктор. Является ли это возможным? если да - как?
Ответы
Ответ 1
Нет, но если вы изменили свою подпись AddRange
, чтобы вернуть экземпляр списка, вы могли бы хотя бы сделать
var list = new List<int>().AddRange(array, n);
который imho, вероятно, более ясен, чем перегрузка конструктора в любом случае.
Ответ 2
Ответ SWeko в основном правильный, хотя, конечно, статья, на которую он ссылается, касается свойств расширения, а не конструкторов расширений.
Мы также сделали грубый проект для конструкторов расширений одновременно с нашими свойствами расширения; они будут хорошим синтаксическим сахаром для шаблона factory. Однако они никогда не проходили стадию проектирования; функция, хотя и симпатичная, на самом деле не нужна и не позволяет запускать какие-либо удивительные новые сценарии.
Если у вас есть действительно удивительная проблема, которую создавали конструкторы расширений, я был бы рад услышать больше деталей. Чем больше обращений в реальном мире мы получаем, тем лучше мы можем оценить относительные достоинства сотен различных предложений функций, которые мы получаем каждый год.
Ответ 3
Одним словом - нет. Взгляните на этот для объяснения.
Они были вырезаны из списка функций С# 3, затем они были вырезаны из списка функций С# 4, и мы можем только надеяться, что они смогут сделать С# 5, но я не очень оптимистичен.
Ответ 4
Я знаю, что это ошибка, просто хочу указать, что вы можете наследовать класс List и сделать что-то вроде этого:
class List<T> : System.Collections.Generic.List<T>
{
public List(T[] a, int n)
: base()
{
AddRange(a, n);
}
}