如果我有一个空集合对象,但需要填充并且将由类(比如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(不确定确切的方法/对象名称)。
由于
答案 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表示其容量,如果您事先知道该数字,则将导致运行时优化。