首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C# 2.0中初始化非空静态集合的正确方法是什么?

在C# 2.0中初始化非空静态集合的正确方法是什么?
EN

Stack Overflow用户
提问于 2009-01-05 16:37:02
回答 8查看 21.5K关注 0票数 21

我想在我的C#类中初始化一个静态集合-类似于:

代码语言:javascript
复制
public class Foo {
  private static readonly ICollection<string> g_collection = ???
}

我不确定这样做的正确方式;在Java中,我可能会这样做:

代码语言:javascript
复制
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),但目前我们的系统不能选择迁移。

为了澄清我最初的问题--我正在寻找一种方法来简洁地声明一个简单的静态集合,比如一个简单的字符串常量集合。静态初始化器风格的方法对于更复杂的对象的集合也是非常有用的。

谢谢!

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-01-05 16:54:59

如果我完全理解您的问题,似乎其他一些人没有抓住要点,您正在寻求以类似于Java的方式创建静态集合,因为您可以在一行代码中声明和填充,而不必创建专用的方法来完成此操作(根据其他一些建议)。这可以使用数组文字(写在两行以防止滚动)来完成:

代码语言:javascript
复制
private static readonly ICollection<string> Strings = 
  new string[] { "Hello", "World" };

这将一次性声明并填充新的只读集合和项列表。在2.0和3.5中工作,我测试它只是为了加倍确定。

但是在3.5版本中,你可以使用类型推断,所以你不再需要使用string[]数组,它可以删除更多的击键操作:

代码语言:javascript
复制
private static readonly ICollection<string> Strings = 
  new[] { "Hello", "World" };

请注意第二行中缺少的"string“类型。字符串是从数组初始值设定项的内容自动推断出来的。

如果您想将其作为列表填充,只需更改新列表的新string[]即可:

代码语言:javascript
复制
private static readonly ICollection<string> Strings = 
  new List<string>() { "Hello", "World" };

当然,因为您的类型是IEnumerable而不是特定的实现,如果您想访问特定于List< string>的方法,如.ForEach(),您需要将其转换为List:

代码语言:javascript
复制
((List<string>)Strings).ForEach(Console.WriteLine);

但对于可移植性来说,这是一个很小的代价,是这样吗?

票数 27
EN

Stack Overflow用户

发布于 2009-01-05 16:43:47

静态构造:

代码语言:javascript
复制
public class Foo
{
    private static readonly ICollection<string> _collection;

    static Foo()
    {
        _collection = new List<string>();
        _collection.Add("One");
        _collection.Add("Two");
    }
}

但请注意,在这种情况下,您可以内联初始化集合(推荐用于performance reasons):

代码语言:javascript
复制
private static readonly ICollection<string> _collection = new List<string>(new string[] { "One", "Two" });

这实际上取决于你的初始化代码有多复杂。

票数 10
EN

Stack Overflow用户

发布于 2009-01-05 16:41:44

也许你可以调用一个静态方法:

代码语言:javascript
复制
public class Foo
{
    private static readonly ICollection<string> g_collection = initializeCollection();

    private static ICollection<string> initializeCollection()
    {
        ... TODO allocate and return something here ...
    }
}

或者,拥有一个静态构造函数(如其他人所建议的)可能是等效的,甚至更惯用。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/413700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档