![](/img/trans.png)
[英]What's the difference between obj1.Equals(obj2) and static Object.Equals(obj1, obj2) in c#?
[英]How do you create an array-like C# constructor that will allow “new MyClass() { obj1, obj2, obj3 };”
我正在嘗試創建一個接受類似於字典,列表或數組的構造函數的類,您可以使用文字集合對象創建對象,但我無法找到如何創建這樣的構造函數,如果它甚至可能。
MyClass obj = new MyClass()
{
{ value1, value2 },
{ value3, value4 }
}
您需要兩件事來使集合初始化器工作:
IEnumerable
(非通用版本) Add()
方法 這是一個看起來像IDictionary的例子:
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
進行計算。
http://blogs.msdn.com/b/madst/archive/2006/10/10/what-is-a-collection_3f00_.aspx
[當您使用
Add
分析類時],您會發現名稱“Add”基本上有兩種不同的含義:a)將參數插入集合中,或
b)返回參數和接收器的算術和
另請注意,如果您的集合類實現了IDisposable
,那么如果Add()
可能拋出異常或者任何被提供給Add()
的表達式都可能拋出異常,則不應使用集合初始值設定項。
變量構造函數怎么樣:
public class MyClass
{
public MyClass() {}
public MyClass(params object[] list) { ... }
}
這個默認值不夠好嗎?
new MyClass {
MyCol = {Value1, Value2, ... },
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.