C# 如何创建一个类似C“构造函数”的数组来允许;新MyClass(){obj1,obj2,obj3}&引用;
我正在尝试创建一个类,该类接受类似于字典、列表或数组的构造函数,您可以在其中使用对象的文本集合创建对象,尽管我一直无法找到如何创建这样的构造函数(如果可能的话)C# 如何创建一个类似C“构造函数”的数组来允许;新MyClass(){obj1,obj2,obj3}&引用;,c#,collections,constructor,C#,Collections,Constructor,我正在尝试创建一个类,该类接受类似于字典、列表或数组的构造函数,您可以在其中使用对象的文本集合创建对象,尽管我一直无法找到如何创建这样的构造函数(如果可能的话) MyClass obj = new MyClass() { { value1, value2 }, { value3, value4 } } 默认值还不够好吗 new MyClass { MyCol = {Value1, Value2, ... }, }; 要使集合初始值设定项正常工作,需要两件事: 实施IEn
MyClass obj = new MyClass()
{
{ value1, value2 },
{ value3, value4 }
}
默认值还不够好吗
new MyClass {
MyCol = {Value1, Value2, ... },
};
要使集合初始值设定项正常工作,需要两件事:
IEnumerable
(非通用版本)Add()
方法class Program
{
static void Main(string[] args)
{
MyClass obj = new MyClass()
{
{value1, value2},
{value3, value4}
};
}
}
public class MyClass : IEnumerable
{
public void Add(object x, object y)
{
}
public IEnumerator GetEnumerator()
{
}
}
请注意,集合初始值设定项代码字面上翻译为:
MyClass temp = new MyClass();
temp.Add(value1, value2);
temp.Add(value3, value4);
MyClass obj = temp;
由于temp变量的原因,如果任何Add()
调用生成异常,则从未实际分配指定的变量(obj
)。有趣的是,这也意味着如果MyClass
要实现IDisposable
,那么当其中一个Add()
方法生成错误时,Dispose()
将不会在构造的对象上被调用(我对此进行了测试以确保)
为什么需要IEnumerable
?因为该接口将集合的类与计算的类区分为Add
[当您使用Add
]分析类时,您会发现名称“Add”有两种根本不同的含义:
a) 将参数插入集合,或
b) 返回参数和接收器的算术和
还请注意,如果您的集合类实现了IDisposable
,那么如果Add()
有可能引发异常,或者提供给Add()
的任何表达式都可能引发异常,则不应使用集合初始值设定项
变量构造函数如何:
public class MyClass
{
public MyClass() {}
public MyClass(params object[] list) { ... }
}
你是说对象初始值设定项?C#3及以上版本具有集合初始值设定项,可以以几乎任何可以想象的方式实现这一点。我不明白你为什么要试图重新创造一些已经存在的东西。@Derek Beattie,
集合初始值设定者
,来自你引用的同一链接。@Robert:我猜想OP是在问如何创建一个类,然后可以使用集合初始值设定者语法进行初始化。@Robert Harvey,实现自定义集合有很多原因。见鬼,.NET4添加了许多新的集合,因此显然还有很大的改进空间。仍然是。我知道Add
方法下的代码是什么样子的,但是GetEnumerator
下的代码是什么样子的?它只是一个普通的IEnumerator
?它是否需要与集合初始值设定项中的值具有相同的形状?@Robert Harvey,出于某种原因,它基于非通用IEnumerator
接口,而不是通用接口。您甚至不必强制执行GetEnumerator()
您只需让它抛出新的NotImplementedException()
,集合初始值设定项仍然可以正常工作。@Robert,@Samuel:如果你感兴趣,这里有一个关于IEnumerable
/Add
要求背后的基本原理的讨论:@LukeH,谢谢你的链接。我在回答中加入了一句话,使之更加完整。