2010-12-10 127 views
13

我需要关于结构的建议。C#编译器错误:“结构中不能有实例字段初始值设定项”

我有2个部分的代码。第一部分是如下:

namespace Project.GlobalVariables 
{ 
    class IOCard 
    { 
     struct InputCard 
     { 
      public string CardNo; 
      public int BaseAddress; 
      public int LowerAddress; 
      public int UpperAddress; 
      public int[] WriteBitNo = new int[16]; 
      public int[] ReadBitNo = new int[16]; 
     } 

     static InputCard[] InputCards = new InputCard[5]; 

     public static string ACardNo = InputCards[1].CardNo; 
     public static string BCardNo = InputCards[2].CardNo; 

    } 
} 

第二部分是如下:

private void Form1_Load(object sender, EventArgs e) 
    { 
     IOCard.ACardNo = "Card A"; 
     IOCard.BCardNo = "Card B"; 

     MessageBox.Show(IOCard.ACardNo); 
     MessageBox.Show(IOCard.BCardNo); 
    } 

我的计划是能够分配和由如图Form1_Load使用IOCard检索InputCards组件。

但是,当我编译代码时,出现以下错误。

Error 1 'Project.GlobalVariables.IOCard.InputCard.WriteBitNo': cannot have instance field initializers in structs E:\Programming\New platform\StandardPlatform\StandardPlatform\Project\GlobalVariables.cs 16 26 StandardPlatform

有人能告诉我如何解决错误? 请指教。谢谢。

这里是我尝试创建和使用的类,但失败了。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Project.GlobalVariables 
{ 
    static class IOCard 
    { 
     public const int TotalInputCard = 10; 
     public const int TotalOutputCard = 10; 

     public class InputCard 
     { 
      public string CardNo = "1"; 
      public int BaseAddress; 
      public int LowerAddress; 
      public int UpperAddress; 
      public int[] WriteBitNo = new int[16]; 
      public int[] ReadBitNo = new int[16]; 
     } 

     public class OutputCard 
     { 
      public string CardNo; 
      public int BaseAddress; 
      public int LowerAddress; 
      public int UpperAddress; 
      public int[] WriteBitNo = new int[16]; 
      public int[] ReadBitNo = new int[16]; 
     } 

     public static InputCard[] InputCards = new InputCard[TotalInputCard]; 
     public static OutputCard[] OutputCards = new OutputCard[TotalOutputCard]; 

     public static int X100 = InputCards[0].WriteBitNo[0]; 
     public static int Y100 = OutputCards[0].WriteBitNo[0]; 
    } 
} 

我试图在使用这些,就像这样:

private void Form1_Load(object sender, EventArgs e) 
{ 
    IOCard.X100 = 1; 
    IOCard.Y100 = 1; 
} 

不管我多么试图在网上搜索答案,我也毫无进展。

请指教。谢谢。

回答

1

使用类而不是结构。结构用于像Point这样的小型类型,它们在堆栈和副本上创建速度更快,而不是动态创建和通过引用传递。

+0

对不起。无法理解你的意思是“动态创建”? – 2010-12-10 06:15:26

+1

当您将结构变量传递给函数或将其从函数中返回时,整个变量将被复制(“动态创建”)。当你传递一个类变量时,只发送对该实例的引用。如果数据少于16个字节,则复制整个实例的速度实际上比将参考传递给它要快。当一个结构体变大时,它会变得更慢,因为无论何时传递的数据都必须复制更多的数据。 – Excrubulent 2013-11-25 19:43:50

1

不知道有关例外,但我有一个解决方案。

你不应该对这个类使用“struct”,它太多了(并且存储了太多的数据)。如果你将它定义为“class”,那么相同的代码就可以正常工作。

5

您既不能初始化struct的字段,也不能定义初始化其字段的默认构造函数。看完你的struct后,我建议你改用class。建议不要在有一堆字段的情况下使用struct

+0

何时使用`struct`指南:http://msdn.microsoft.com/en-us/library/y23b5415%28VS.71%29.aspx – decyclone 2010-12-10 06:17:12

1

是否有一个特定的原因,你为什么要这是一个struct而不是class

如果你使它成为class,它工作得很好。

9

什么是它想说的是,当你有InputCards = new InputCard[5];将分配的内存块5倍InputCard结构的大小和它的所有字节设置为0,没有机会执行int[] WriteBitNo = new int[16];和这样的任务,所以你不能拥有它们。

您的选择是为您的结构手动调用初始值设定项或将其设置为类,然后使用5个新实例InputCard手动初始化InputCards阵列。

1

试试这个。用工厂功能Create()初始化InputCard:

namespace Project.GlobalVariables 
{ 
    class IOCard 
    { 
     struct InputCard 
     { 
      public string CardNo; 
      public int BaseAddress; 
      public int LowerAddress; 
      public int UpperAddress; 
      public int[] WriteBitNo; 
      public int[] ReadBitNo; 

      static InputCard Create() 
      { 
       return new InputCard() 
       { 
        CardNo = string.Empty, 
        WriteBitNo = new int[16], 
        ReadBitNo = new int[16] 
       }; 
      } 
     } 

     static InputCard[] InputCards = new InputCard[] 
     { 
      InputCard.Create(), 
      InputCard.Create(), 
      InputCard.Create(), 
      InputCard.Create(), 
      InputCard.Create() 
     }; 

     public static string ACardNo = InputCards[1].CardNo; 
     public static string BCardNo = InputCards[2].CardNo; 

    } 
} 
1

在C#,一个struct值是不是引用到在class类型的值是这样的一个对象。 struct的值是struct的实例字段的所有值的“联合”。

现在,struct类型的默认值是所有这些字段的默认值为的值。由于C#的语法开始:

new S() // S is a value-type 

其中S是一个结构类型,已经等同于结构的默认值。没有构造函数调用!这是(不能在结构实例字段初始化),它可以(现在)也可以写

default(S) // S is a value-type 

现在,像

struct S 
{ 
    int field = 42; // non-static field with initializer, disallowed! 

    // ... 
} 

完全相同的值是非法的。他们可能给人的印象是new S()field应该是42,但实际上new S()field必须是默认值int(这是零,不同于42)。

有了这个解释,你也可以在C#中看到它为什么是not possible to create a non-static, zero-parameter constructor for a struct type

相关问题