使用多个命令在 class 中预定义字段

Predefine field in class using several commands

假设我有这个 class 和一个用两个条目填充内部列表的构造函数:

class MyClass
{
    IList<int> someList;

    public MyClass()
    {
        someList = new List<int>();
        someList.Add(2);
        someList.Add(4);

        ... // do some other stuff
    }
}

现在假设我有几个构造函数,它们都对内部列表执行相同的操作(但在其他方面有所不同)。

我想知道是否可以将列表的生成和填写直接外包给外地,像这样:

class MyClass
{
    IList<int> someList = new List<int>(); someList.Add(2); someList.Add(4);
    // Does not compile.

    public MyClass()
    {
        ... // do some other stuff
    }
}

是否可以在字段定义中调用多个命令,如果可以,如何调用?

您可以像这样预先实例化 IList 并在每次访问索引器时添加您的值:

IList<int> someList = new List<int>() { 2, 4 };

这将在使用构造函数之前进行初始化。


更新 1

正如 OP 在评论中提到的那样,对于 LinkedList<T>() 你必须使用带有一些 IEnumarable 的构造函数(在我的示例中是一个数组)。

LinkedList<int> myList1 = new LinkedList<int>(new int[] {2,3,4});

更新 2

阅读您的最后一条评论后,您正在实例化过程中寻找 Fluent Interfaces。这是一种将函数链接在一起的方法,看起来像这样:

Customer c1 = new Customer()  
                  .FirstName("matt")
                  .LastName("lastname")
                  .Sex("male")
                  .Address("austria");

集合中默认不提供此功能 Classes.You 必须为此实现您自己的 IList<T> 版本。

Lambda 表达式是一种实现此目的的方法,如您的更新所示...

知道了:

IList<int> someList = new Func<List<int>>(() => { IList<int> l = new List<int>(); l.Add(2); l.Add(4); return l; })();

解释:

() => { IList<int> l = new List<int>(); l.Add(2); l.Add(4); return l; }

是一个不接受参数并返回一个 IList<int> 的函数,所以它是一个 Func<IList<int>>.

虽然编译器知道这一点,但我似乎必须通过

明确说明这一事实
new Func<IList<int>>(...)

以便稍后调用。像往常一样通过在 Func.

后面放置两个括号 () 来完成调用

或者以更易读的方式编写它(这样我什至不需要 new 关键字,而是必须使 Func 静态):

static Func<IList<int>> foo = () => { IList<int> l = new List<int>(); l.Add(2); l.Add(4); return l; };

IList<int> someList = foo();