是否可以添加构造函数扩展方法?我想添加一个List< 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]);
}
我也希望将其作为构造函数来实现。可能吗 ?如果是的话 - 怎么样?
答案 0 :(得分:52)
不,但是如果您更改了AddRange
签名以返回列表实例,那么您至少可以
var list = new List<int>().AddRange(array, n);
无论如何,imho可能比重载构造函数更清晰。
答案 1 :(得分:35)
SWeko的答案基本上是正确的,当然他链接的文章是关于扩展属性而不是扩展构造函数。
我们在扩展属性的同时也对扩展构造函数进行了粗略设计;它们对于工厂模式来说是一个很好的语法糖。然而,他们从未超越设计阶段;该功能虽然不错,但并不是必需的,并且不会启用任何令人敬畏的新场景。
如果你有一个扩展构造者会解决的非常棒的问题,我会很高兴听到更多细节。我们获得的现实世界反馈越多,我们就能越好地评估每年获得的数百种不同功能建议的相对优点。
答案 2 :(得分:20)
总之 - 没有。请查看this以获得一些解释。
它们是从C#3功能列表中删除的,然后从C#4功能列表中删除,我们只能希望它们能够制作C#5功能,但我不是很乐观。
答案 3 :(得分:10)
我知道这是一个颠簸,只是想指出你可以继承List类并做这样的事情:
class List<T> : System.Collections.Generic.List<T>
{
public List(T[] a, int n)
: base()
{
AddRange(a, n);
}
}
答案 4 :(得分:0)
是的,但不是?
MyClass{
public MyClass(params){ //do stuff };
public MyClass MyConstructorAddOn(moreParams){ //do more stuff; return this;}
}
然后这样调用:
MyClass(params).MyConstructorAddOn(moreParams);
它有点像扩展方法。虽然不是构造函数,但它可以用作构造函数上的菊花链,以立即在构造函数之外执行更多操作。