簡體   English   中英

你如何創建一個類似數組的C#構造函數,它將允許“new MyClass(){obj1,obj2,obj3};”

[英]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 }
}

您需要兩件事來使集合初始化器工作:

  1. 實現IEnumerable (非通用版本)
  2. 與集合初始值設定項匹配的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()的表達式都可能拋出異常,則不應使用集合初始值設定項。

https://connect.microsoft.com/VisualStudio/feedback/details/654186/collection-initializers-called-on-collections-that-implement-idisposable-need-to-call-dispose-in-case-of-failure#

變量構造函數怎么樣:

public class MyClass
{
    public MyClass() {}
    public MyClass(params object[] list) { ... }
}

這個默認值不夠好嗎?

new MyClass {
   MyCol = {Value1, Value2, ... },
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM