有没有办法在不使用构造函数的情况下初始化结构的成员?

Mik*_*sen 12 c# struct

我有一个struct包含两个列表:

struct MonthData
{
   public List<DataRow> Frontline;
   public List<DataRow> Leadership;
}
Run Code Online (Sandbox Code Playgroud)

但是,我想在创建结构时初始化它们.如果我尝试:

struct MonthData
{
   public List<DataRow> Frontline = new List<DataRow>();
   public List<DataRow> Leadership = new List<DataRow>();
}
Run Code Online (Sandbox Code Playgroud)

然后我得到:

Error   23  'MonthData.Frontline': cannot have instance field initializers in structs
...
Run Code Online (Sandbox Code Playgroud)

由于结构不能有无参数构造函数,我不能只在构造函数中设置它.到目前为止,我只能看到以下选项:

  1. 在创建MonthData实例时初始化这两个属性
  2. 使用类而不是结构
  3. 使用参数创建构造函数并使用它
  4. 为懒惰初始化它们的属性创建getter和setter.

推荐的方法是什么?现在,我在想这个课程是最好的主意.

Dan*_*ann 7

你应该使用一个班级.来自MSDN:

通常,类用于建模更复杂的行为,或者在创建类对象后要修改的数据.结构最适合于主要包含在创建结构后不打算修改的数据的小型数据结构.


Cha*_*ana 7

如果您只是询问语法...尝试构建和使用静态工厂...通常,结构应该用于不可变的东西,而工厂(调用私有构造函数)是一种更好的方法对于不可变类型而不是使用公共构造函数.

  struct MonthData 
  {    
      public List<DataRow> Frontline;
      public List<DataRow> Leadership; 
      private MonthData(List<DataRow> frontLine = null, 
                        List<DataRow> leadership = null)
      { 
         Frontline = frontLine?? new List<DataRow>();
         Leadership = leadership?? new List<DataRow>();  
      }
      public static MonthData Factory(
          List<DataRow> frontLine= null, 
          List<DataRow> leadership= null)
      { return new MonthData(frontLine, leadership); }
  } 
Run Code Online (Sandbox Code Playgroud)


Den*_*aub 7

List<T>无论如何都在结构中使用引用类型(),因此使用结构作为值类型对我没有任何意义.我只是去上课.