在结构中初始化列表

时间:2014-06-13 04:12:43

标签: c# struct initialization

我目前有一个Match结构,其中包含一个Blocks列表。

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

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

Use of unassigned local variable 'matchData'

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

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

会导致以下错误:

Structs cannot have instance field initializers

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

2 个答案:

答案 0 :(得分:5)

来自MSDN:

  

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

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>();

作为旁注,你可能最好在这里使用类而不是结构。您使用dosent似乎符合典型用例,如下所示:http://msdn.microsoft.com/en-us/library/ah19swz4.aspx

答案 1 :(得分:4)

您收到了“使用未分配的本地变量'matchData'”,因为您没有致电new Match()

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

可是:

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

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

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

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