Tar*_*Tar 74 c# extension-methods constructor
是否可以添加构造函数扩展方法?我想添加一个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]);
}
...
Run Code Online (Sandbox Code Playgroud)
所以用法是:
List<byte> some_list = new List<byte>(my_byte_array,number_of_bytes);
Run Code Online (Sandbox Code Playgroud)
我已经添加了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]);
}
Run Code Online (Sandbox Code Playgroud)
我也想把它作为构造函数.可能吗 ?如果是 - 怎么样?
fea*_*net 53
不,但如果您更改AddRange签名以返回列表实例,那么您至少可以这样做
var list = new List<int>().AddRange(array, n);
Run Code Online (Sandbox Code Playgroud)
无论如何,哪个imho可能比重载构造函数更清晰.
Eri*_*ert 35
SWeko的答案基本上是正确的,当然他链接的文章是关于扩展属性而不是扩展构造函数.
我们还在扩展属性的同时对扩展构造函数进行了粗略设计; 它们对于工厂模式来说是一个很好的语法糖.然而,他们从未超越设计阶段; 该功能虽然不错,但并不是必需的,并且不会启用任何令人敬畏的新场景.
如果你有一个扩展构造者会解决的非常棒的问题,我会很高兴听到更多的细节.我们获得的现实世界反馈越多,我们就能越好地评估每年我们获得的数百种不同功能建议的相对优点.
Bau*_*uss 11
我知道这是一个颠簸,只是想指出你可以继承List类并做这样的事情:
class List<T> : System.Collections.Generic.List<T>
{
public List(T[] a, int n)
: base()
{
AddRange(a, n);
}
}
Run Code Online (Sandbox Code Playgroud)