繁体   English   中英

在类中定义结构时,如何初始化结构成员?

[英]How to initialize struct members, when struct is defined within a class?

使用c#,我想从该类中的某个类的结构中设置变量。 C#的新手。 帮助表示赞赏。

class myclass
{
   public struct mystruct
   {
       public int something;
   }

   public void init() 
   {
      mystruct.something = 20; // <-- this is an error
   }

   static void Main(string[] args)
   {
       myclass c = new myclass();
       c.init();          
   }
}

错误:“非静态字段,方法或属性myclass.mystruct.something需要对象引用”

mystruct是类中的一种类型,但是您没有任何具有该类型的字段:

class myclass
{
   public struct mystruct
   {
       public int something;
   }

   private mystruct field;

   public void init() 
   {
      field.something = 20; // <-- this is no longer an error :)
   }

   static void Main(string[] args)
   {
       myclass c = new myclass();
       c.init();          
   }
}

结构定义和结构实例之间有区别。 您需要首先实例化mystruct,然后可以为其分配值-要么为其赋值,要么将mystruct声明为静态字段。

public struct mystruct
{
  public int something;
}

var foo = new mystruct();
foo.something = 20;

要么

public struct mystruct
{
  public static int something;
}

mystruct.something = 20;

您应该为mystruct创建一个对象

public void init() 
{
  mystruct m = new mystruct();
  m.something = 20; 
}
public struct mystruct
{
   public int something;
}

这只是一个定义。 由于错误状态,您必须具有一个初始化的对象才能使用实例变量。

class myclass
{
   public struct mystruct
   {
       public int something;
   }

   public void init() 
   {
      mystruct haha = new mystruct();
      haha.something = 20; // <-- modify the variable of the specific instance
   }

   static void Main(string[] args)
   {
       myclass c = new myclass();
       c.init();          
   }
}
class myclass
{
  mystruct m_mystruct;

   public void init() 
   {
      m_mystruct.something = 20; 
   }

   static void Main(string[] args)
   {
       myclass c = new myclass();
       c.init();          
   }
}

 public struct mystruct
   {
       public int something;
   }

哇,太神奇了!

我敢打赌,即使不是全部,大多数人也会指出,您不仅使Type与Instance混淆,而且没有以推荐的方式使用Struct。

您应该仅将结构用作不可变对象,这意味着您应该使所有成员成为readonly成员,并且只能在构造函数中设置它们!

class myclass
{
  mystruct oneMyStruct;

  public struct mystruct
  {
    public readonly int something;
    public mystruct(int something_) { something = something_; }
  }

  public void init()
  {
    oneMyStruct = new mystruct(20);
  }

  static void Main(string[] args)
  {
    myclass c = new myclass();
    c.init();
  }

}

如果您需要对成员进行读写访问,则不应使用struct,而应使用class!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM