【问题标题】:Initializing a list within a struct在结构中初始化列表
【发布时间】:2014-06-13 04:12:43
【问题描述】:

我目前有一个包含块列表的 Match 结构。

public struct Match{
    public List<Block> blocks;
}

当我尝试创建一个新的匹配(在本例中称为 matchData)并将块添加到其块列表中时,我的编译器输出:

Use of unassigned local variable 'matchData'

我尝试通过这样做来初始化列表:

public struct Match{
    public List<Block> blocks = new List<Block>();
}

导致以下错误:

Structs cannot have instance field initializers

那么我应该如何初始化我的 Match 结构?我必须制作一个构造函数吗?

【问题讨论】:

  • 你为什么使用结构而不是类?
  • 我制作了一个结构体还有两个原因:1) 匹配可能包含其他数据,例如匹配的方向以及块网格中最低的块。 2) 还会有一个匹配列表,所以它基本上是一个以特定方式排序的列表列表的好方法。我没有理由不能使用构造函数,我想我是这样问的,以确保我没有忽略某些东西。我还不习惯 C# 中的结构,因为它们看起来与我更熟悉的其他编程语言不同。
  • 以上都不排除您使用类而不是结构。如果你不熟悉 C# 中的结构,你应该小心。结构是值类型,它有时会以不直观的方式改变它们的行为方式。结构应该非常小而且简单。您的“匹配”实体对我来说更像是一门课。看看these guidelines

标签: c# struct initialization


【解决方案1】:

来自 MSDN:

在结构体中初始化实例字段也是错误的。 您只能通过使用参数化来初始化结构成员 构造函数或通过在结构之后单独访问成员 被宣布。任何私有或其他不可访问的成员都可以是 仅在构造函数中初始化。

http://msdn.microsoft.com/en-us/library/0taef578.aspx

因此您可以像这样在参数化构造函数中初始化列表:

public struct Match{
    public List<Block> blocks;
    
    public Match(List<Block> blocks)
    {
        this.blocks = blocks;
    }
}

或者从外面设置:

Match m = new Match();
m.blocks = new List<Block>();

附带说明一下,在这里使用类而不是结构可能会更好。您的使用似乎不适合典型用例,如下所示:http://msdn.microsoft.com/en-us/library/ah19swz4.aspx

【讨论】:

    【解决方案2】:

    您收到“使用未分配的局部变量 'matchData'”,因为您没有调用 new Match()

    Match matchData;
    matchData.blocks = new List<Block>();    // error!
    

    但是:

    Match matchData = new Match();
    matchData.blocks = new List<Block>();    // fine!
    

    结构有一个隐式的无参数构造函数,它将所有字段初始化为默认值。

    但是:您应该使用 class 而不是 struct,除非您完全了解结构在 C# 中的工作原理。不要只使用结构,因为它比类“轻”。

    特别是,您的 Block 结构是可变的,which makes for a bad time

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-11
      • 2016-03-20
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多