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

C# 是否可以创建构造函数扩展方法?怎样?,c#,constructor,extension-methods,C#,Constructor,Extension Methods,是否可以添加构造函数扩展方法?我想添加一个List构造函数,从给定的部分填充的缓冲区中接收特定数量的字节(无需仅复制相关字节等开销): 。。。 公共静态列表(此列表l,T[]a,int n) { 对于(int i=0;i

是否可以添加构造函数扩展方法?我想添加一个List构造函数,从给定的部分填充的缓冲区中接收特定数量的字节(无需仅复制相关字节等开销):

。。。
公共静态列表(此列表l,T[]a,int n)
{
对于(int i=0;i
因此,用法是:

List<byte> some_list = new List<byte>(my_byte_array,number_of_bytes);
List some\u List=新列表(我的字节数组,字节数);
我已经添加了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]);
}
publicstaticvoidaddrange(此列表l,T[]a,int n)
{
对于(int i=0;i

我也想做一个构造器。可能吗?如果是-怎么做?

一句话-不。请看一些解释


它们是从C#3功能列表中删除的,然后是从C#4功能列表中删除的,我们只能希望它们能够生成C#5功能,但我不是很乐观。

不,但是如果您更改了
AddRange
签名以返回列表实例,那么您至少可以这样做

var list = new List<int>().AddRange(array, n);
var list=new list().AddRange(数组,n);

这可能比重载构造函数更清楚。

SWeko的答案基本上是正确的,当然他链接的文章是关于扩展属性而不是扩展构造函数的

我们还为扩展构造函数做了一个粗略的设计,同时我们也做了扩展属性的设计;对于工厂模式来说,它们将是一种很好的语法糖。然而,他们从未经过设计阶段;该功能虽然很好,但实际上并不是必需的,也不能启用任何令人敬畏的新场景


如果您有一个扩展构造函数可以解决的非常棒的问题,我很乐意听到更多细节。我们得到的真实反馈越多,我们就能够更好地评估每年收到的数百种不同功能建议的相对优点。

我知道这是一个难题,我只想指出,您可以继承List类并执行以下操作:

class List<T> : System.Collections.Generic.List<T>
    {
        public List(T[] a, int n)
            : base()
        {
                AddRange(a, n);
        }
    }
类列表:System.Collections.Generic.List
{
公共列表(T[]a,int n)
:base()
{
AddRange(a,n);
}
}
是但不是

MyClass{
   public MyClass(params){ //do stuff };
   public MyClass MyConstructorAddOn(moreParams){ //do more stuff; return this;}
}
然后这样称呼:

MyClass(params).MyConstructorAddOn(moreParams); 

它的工作原理有点像扩展方法。虽然不是构造函数,但它可以用作构造函数上的菊花链,立即在构造函数之外做更多的事情。

你缺乏乐观是有道理的。从C#8开始,仍然没有HahaGreat!我错过了这种可能性——这正是我想要的!伟大的选择!我使用您的示例向DataColumn对象添加了一个Initialize方法。我想,一个更好的建筑商(…)也太过分了。嗨,埃里克。这里有一个例子。不知道这是否好,但是。。。我从Silverlight 2.0获得了50多个类,我必须将它们转换为WPF 4.0。类WriteableBitmap有一个完全不同的构造函数。WPF中要复杂得多,但我们可以每4个新参数修改一次。通过有可能创建(超越)一个新的构造函数,我们将能够节省大量的代码重写。谢谢。构造函数扩展
string
非常有用,这样它就可以使用
default(string)
。或者为
string
提供一个默认构造函数。我意识到我让一个僵尸复活了,但是有一个地方,构造扩展非常有用,那就是异常。我想用采用format和params object[]参数的重载替换大多数扩展中的消息参数,这样我就不需要显式调用string.format()来创建消息。通过为继承基类的所有类提供公共初始化点,此功能可能会有所帮助。例如,
Spec1
Spec2
继承自
Base
抽象类(都是您不能修改的类(例如编译的程序集))。通过将无参数扩展构造函数添加到
Base
(以及扩展属性/方法),可以在单个扩展构造函数中为
Spec1
Spec2
提供初始化逻辑。我从现实场景中提取了这个用例:我想为我的一些实体框架实体创建一个基类,并使用单个扩展构造函数为所有实体添加一些初始化内容。
MyClass(params).MyConstructorAddOn(moreParams);