是否可以创建构造函数扩展方法?怎么样?

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的答案基本上是正确的,当然他链接的文章是关于扩展属性而不是扩展构造函数.

我们还在扩展属性的同时对扩展构造函数进行了粗略设计; 它们对于工厂模式来说是一个很好的语法糖.然而,他们从未超越设计阶段; 该功能虽然不错,但并不是必需的,并且不会启用任何令人敬畏的新场景.

如果你有一个扩展构造者会解决的非常棒的问题,我会很高兴听到更多的细节.我们获得的现实世界反馈越多,我们就能越好地评估每年我们获得的数百种不同功能建议的相对优点.

  • 我意识到我将一个僵尸带回了生活,但是有一个地方,那里有一个非常有用的构造扩展是异常.我想用一个带有format和params object []参数的重载替换大多数扩展中的message参数,这样我就不需要显式地调用string.Format()来创建消息. (5认同)

SWe*_*eko 20

总而言之 - 没有.看看这个是为了解释一下.

它们是从C#3功能列表中删除的,然后从C#4功能列表中删除,我们只能希望它们可以制作C#5功能,但我不是很乐观.

  • 你缺乏乐观是合理的. (42认同)
  • 但斯威夫特有它.< (7认同)
  • 从 C# 8 开始,还没有,哈哈 (5认同)

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)