【问题标题】:C# Equivalent of Java anonymous inner classes with init blocks带有初始化块的 Java 匿名内部类的 C# 等效项
【发布时间】:2009-02-11 07:02:36
【问题描述】:

在Java中,我喜欢使用诸如

之类的结构
List<String> list = new ArrayList<String>() {{add("foo");}};

有没有办法在 C# 的 1 行中也做到这一点?

【问题讨论】:

    标签: c# java class initialization anonymous-class


    【解决方案1】:

    这称为集合初始化器,它是 C# 3.0 的一部分。

    除了列表之外,您还可以初始化更复杂类型的集合,只要它们实现 IEnumerable 并为集合初始化程序中的每个元素提供适当的 Add 方法。比如你可以像这样使用Dictionary&lt;TKey, TValue&gt;Add(key, value)方法:

    var dict = new Dictionary<string, int> 
    { 
        {"first", 10 }, 
        {"second", 20 }
    };
    

    更多细节可以在C# in Depth的第8章找到,可以从Manning's web site免费下载。

    【讨论】:

    • 这是最好的答案,因为它使用了 var - 想想你可以通过让类型推断处理左侧来节省你职业生涯中的击键。你可以提前退休!
    • @serg10 你使用了所有保存的在 StackOverFlow 上键入 cmets 的击键 - 你不能提前退休!
    【解决方案2】:

    我认为你想要的是一个数组初始化器

    List<string> list = new List<string>() { "foo" };
    

    多个项目应以逗号分隔

    List<string> list = new List<string>() { "foo","bar","bas"};
    

    【讨论】:

    • 请注意,如果您正在调用无参数构造函数,则不需要 () 部分。只是 new List { "hello", "there" } 工作正常。
    • -1。答案没有提到这仅从 C# 3.0 开始可用。
    【解决方案3】:

    您可以在 .NET 3.5 中设置属性值:

    List<string> list = new List<string> () { Property = Value, Property2 = Value2 };
    

    或者初始化一个数组:

    List<string> list = new List<string> () { "value1", "value2" };
    

    但是,您不能以这种方式调用方法。

    【讨论】:

    • 如果您使用 C# 3.0,您也可以在 .NET 2.0 中执行此操作。
    【解决方案4】:

    如果您只需要处理将对象添加到集合中,那么集合初始化器可以很好地工作,但是如果您需要执行更多静态初始化,您可以使用称为静态构造器的东西,它的工作原理与静态初始化器相同爪哇

    This 的格式很差,但似乎覆盖了它

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多