我想在我的C#类中初始化一个静态集合-类似于:
public class Foo {
private static readonly ICollection<string> g_collection = ???
}
我不确定这样做的正确方式;在Java中,我可能会这样做:
private static final Collection<String> g_collection = Arrays.asList("A", "B");
在C# 2.0中有类似的构造吗?
我知道在更高版本的C#/.NET中,您可以执行集合初始值设定项(http://msdn.microsoft.com/en-us/library/bb384062.aspx),但目前我们的系统不能选择迁移。
为了澄清我最初的问题--我正在寻找一种方法来简洁地声明一个简单的静态集合,比如一个简单的字符串常量集合。静态初始化器风格的方法对于更复杂的对象的集合也是非常有用的。
谢谢!
发布于 2009-01-05 16:54:59
如果我完全理解您的问题,似乎其他一些人没有抓住要点,您正在寻求以类似于Java的方式创建静态集合,因为您可以在一行代码中声明和填充,而不必创建专用的方法来完成此操作(根据其他一些建议)。这可以使用数组文字(写在两行以防止滚动)来完成:
private static readonly ICollection<string> Strings =
new string[] { "Hello", "World" };
这将一次性声明并填充新的只读集合和项列表。在2.0和3.5中工作,我测试它只是为了加倍确定。
但是在3.5版本中,你可以使用类型推断,所以你不再需要使用string[]数组,它可以删除更多的击键操作:
private static readonly ICollection<string> Strings =
new[] { "Hello", "World" };
请注意第二行中缺少的"string“类型。字符串是从数组初始值设定项的内容自动推断出来的。
如果您想将其作为列表填充,只需更改新列表的新string[]即可:
private static readonly ICollection<string> Strings =
new List<string>() { "Hello", "World" };
当然,因为您的类型是IEnumerable而不是特定的实现,如果您想访问特定于List< string>的方法,如.ForEach(),您需要将其转换为List:
((List<string>)Strings).ForEach(Console.WriteLine);
但对于可移植性来说,这是一个很小的代价,是这样吗?
发布于 2009-01-05 16:43:47
静态构造:
public class Foo
{
private static readonly ICollection<string> _collection;
static Foo()
{
_collection = new List<string>();
_collection.Add("One");
_collection.Add("Two");
}
}
但请注意,在这种情况下,您可以内联初始化集合(推荐用于performance reasons):
private static readonly ICollection<string> _collection = new List<string>(new string[] { "One", "Two" });
这实际上取决于你的初始化代码有多复杂。
发布于 2009-01-05 16:41:44
也许你可以调用一个静态方法:
public class Foo
{
private static readonly ICollection<string> g_collection = initializeCollection();
private static ICollection<string> initializeCollection()
{
... TODO allocate and return something here ...
}
}
或者,拥有一个静态构造函数(如其他人所建议的)可能是等效的,甚至更惯用。
https://stackoverflow.com/questions/413700
复制相似问题