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

时间:2011-01-24 12:37:32

标签: c# constructor extension-methods

是否可以添加构造函数扩展方法?我想添加一个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]);
}

我也希望将其作为构造函数来实现。可能吗 ?如果是的话 - 怎么样?

5 个答案:

答案 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); 

它有点像扩展方法。虽然不是构造函数,但它可以用作构造函数上的菊花链,以立即在构造函数之外执行更多操作。