C# C“编译器错误:”;结构中不能有实例字段初始值设定项;
我需要结构方面的建议 我有两段代码。第一节内容如下:C# C“编译器错误:”;结构中不能有实例字段初始值设定项;,c#,C#,我需要结构方面的建议 我有两段代码。第一节内容如下: namespace Project.GlobalVariables { class IOCard { struct InputCard { public string CardNo; public int BaseAddress; public int LowerAddress; public int
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);
}
第二部分如下:
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);
}
我的计划是能够使用IOCard
分配和检索InputCards
组件,如Form1\u Load
所示
然而,当我编译代码时,我得到以下错误
错误1“Project.GlobalVariables.IOCard.InputCard.WriteBitNo”:结构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;
}
无论我多么努力地在网上寻找答案,我都一无所获
请告知。谢谢。使用类而不是结构。结构用于像Point这样的小类型,在堆栈上创建和复制比动态创建和按引用传递更快。不确定是否存在异常,但我有一个解决方案
这个类不应该使用“struct”,因为它太多(并且存储了太多数据)。如果将其定义为“类”,则相同的代码可以正常工作。您既不能初始化结构的字段,也不能定义默认构造函数来初始化其字段。在查看了结构之后,我建议您改用类
。对于有大量字段的场景,不建议使用struct
。是否有特殊原因使其成为struct
而不是类
如果你把它变成一个类
,它就工作得很好。它想说的是,当你有输入卡=新的输入卡[5]代码>它将分配一块内存,其大小为输入卡结构的5倍,并将其所有字节设置为0。没有机会执行int[]WriteBitNo=new int[16]代码>和此类分配,因此您不能拥有它们
您可以选择手动调用结构的初始值设定项,或者将其设为类,并使用5个新的InputCard实例手动初始化InputCards
数组。使用工厂函数Create()
初始化输入卡:
在C#中,struct
值是而不是类
类型的值那样对对象的引用。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!
// ...
}
是非法的(结构中不能有实例字段初始值设定项)。它们可能给人的印象是新S()
的字段将是42
,但实际上新S()
的字段必须是int
的默认值(即零,与42
不同)
有了这个解释,你也明白了为什么,在C#中。对此感到抱歉。无法理解“动态创建”是什么意思?当向函数传递结构变量或从函数返回结构变量时,会复制整个变量(“动态创建”)。传递类变量时,只发送对该实例的引用。如果数据小于16字节,那么复制整个实例实际上比传递引用要快。当一个结构变得更大时,它会变得更慢,因为每当它被传递到任何地方时都必须复制更多的数据。关于何时使用struct
:不正确。Microsoft在这里有一篇C#编程指南文章,介绍了如何“初始化结构的字段”和“如何定义构造函数来初始化其字段”:您所说的“不可能”实际上既受支持又简单。感谢您的建议。我怎样才能在课堂上做到这一点?有样本代码吗?谢谢