我需要有关结构的建议。
我有两段代码。第一部分如下:
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);
}
我的计划是能够使用InputCards
IOCard
分配和检索Form1_Load
组件,如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];
}
}
所示。
但是,当我编译代码时,我收到以下错误。
错误1'Project.GlobalVariables.IOCard.InputCard.WriteBitNo':结构中不能有实例字段初始值设定项E:\ Programming \ New platform \ StandardPlatform \ StandardPlatform \ Project \ GlobalVariables.cs 16 26 StandardPlatform
有人可以告诉我如何解决错误吗? 请指教。感谢。
以下是我尝试创建和使用的类,但失败了。
Form_Load
我尝试在private void Form1_Load(object sender, EventArgs e)
{
IOCard.X100 = 1;
IOCard.Y100 = 1;
}
中使用这些内容,如下所示:
{{1}}
无论我多少尝试在网上搜索答案,我都无处可去。
请指教。感谢。
答案 0 :(得分:9)
它试图说的是,当你有InputCards = new InputCard[5];
时,它将分配一个5倍于InputCard
结构大小的内存块,并将其所有字节设置为0.没有机会执行int[] WriteBitNo = new int[16];
和此类作业,因此您无法拥有它们。
您可以选择手动调用结构的初始值设定项或将其设为类,并使用InputCards
的5个新实例手动初始化InputCard
数组。
答案 1 :(得分:4)
您既不能初始化struct
的字段,也不能定义默认构造函数来初始化它的字段。查看struct
后,我建议您改用class
。不建议在有大量字段的情况下使用struct
。
答案 2 :(得分:4)
在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!
// ...
}
是非法的(不能在结构中使用实例字段初始值设定项)。他们可能会认为field
的{{1}}为new S()
,但事实上42
的{{1}}必须是field
的默认值1}}(为零,与new S()
不同)。
通过这个解释,您还可以在C#中看到它为not possible to create a non-static, zero-parameter constructor for a struct type的原因。
答案 3 :(得分:2)
试试这个。使用工厂函数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;
}
}
答案 4 :(得分:0)
使用class而不是结构。结构用于像Point这样的小类型,它们在堆栈和副本上创建得更快,而不是动态创建并通过引用传递。
答案 5 :(得分:0)
不确定异常,但我有一个解决方案。
你不应该为这个类使用“struct”,它太多了(并且存储了太多的数据)。如果将其定义为“类”,则相同的代码可以正常工作。
答案 6 :(得分:0)
您是否希望将其设为struct
而不是class
?
如果你使它成为class
,它就可以了。