我应该用ctor或私有静态方法填充集合吗?

时间:2010-01-13 22:22:57

标签: c#

如果我有一个空集合对象,但需要填充并且将由类(比如Foo类)使用,那么最好是在构造函数中填充吗?

类似的东西:

List<string> strings = new List<string();
strings.Add("sjsjhsj");
 // So on...

或者它应该在静态私人监管机构中?状态没有改变包含类,所以这可能是静态的,对吧?

BTW,如果我写这个.Name = name;或者:

john.Name = name;
// Instance method passing in john as a Person object.

这些都是已知的改变状态,因此不应该是静态的吗?或者仅仅是实例?

如果我需要一个我希望能够在不重新编译的情况下更改内容的集合,我应该使用txt文件或xml作为源代码。使用集合时哪个更快? Txt文件将使用ReadAllLines();和XML将使用NodeNavigator(不确定确切的方法/对象名称)。

由于

3 个答案:

答案 0 :(得分:3)

首先,静态构造函数不能是公共/私有的。他们只是存在。

如果您的集合的同一个实例将在拥有类的所有实例之间共享,那么它可以是静态的。

静态并不意味着它不会改变状态。它仍然可以改变。不同之处在于静态字段在类的所有实例之间共享,因此需要协调对该字段的可变操作。如果该类的所有实例总是使用相同的数据,请将其设置为静态。

文本文件或xml文件是否更快取决于数据。

答案 1 :(得分:2)

我认为你对“静态”的含义有误解。

在C#中,“静态”并不意味着状态不会改变。您可以拥有具有更改状态的静态变量。

在C#中,“静态”是指变量的范围 - 而不是它的可变性。当您将变量定义为静态(并使用静态ctor)时,您将在类级别而不是实例级别工作。

如果您的变量特定于类,而不是该类的实例,则可能适合将其设置为静态。

答案 2 :(得分:0)

如果集合在编译时具有静态的已知值集,那么在C#3.0(VS 2008)中,您可以在类定义中使用集合初始化器语法:

private static readonly IList<string> strings = new ReadOnlyCollection<string>(
    new List<string>(5)
    {
        "sjsjhsj",
        "string 2",
        "string 3",
        "string 4",
        "string 5"
    });

ReadOnlyCollection位于System.Collections.ObjectModel命名空间中。 List<string>构造函数中的5表示其容量,如果您事先知道该数字,则将导致运行时优化。