我需要有关结构的建议.
我有两段代码.第一部分如下:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
第二部分如下:
private void Form1_Load(object sender, EventArgs e)
{
IOCard.ACardNo = "Card A";
IOCard.BCardNo = "Card B";
MessageBox.Show(IOCard.ACardNo);
MessageBox.Show(IOCard.BCardNo);
}
Run Code Online (Sandbox Code Playgroud)
我的计划是能够InputCards使用IOCard如下所示分配和检索组件Form1_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];
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用这些Form_Load,如下:
private void Form1_Load(object sender, EventArgs e)
{
IOCard.X100 = 1;
IOCard.Y100 = 1;
}
Run Code Online (Sandbox Code Playgroud)
无论我多少尝试在网上搜索答案,我都无处可去.
请指教.谢谢.
它试图说的是,当你拥有InputCards = new InputCard[5];它时,它将分配一个5倍于InputCard结构大小的内存块,并将其所有字节设置为0.没有机会执行int[] WriteBitNo = new int[16];这样的分配,所以你不能拥有它们.
您可以选择手动调用结构的初始化程序或使其成为类,并InputCards使用5个新实例手动初始化数组InputCard.
您既不能初始化 astruct的字段,也不能定义默认构造函数来初始化它的字段。在查看您的 之后struct,我建议您改用 a class。不建议将 astruct用于您有一堆字段的场景。
在C#中,struct值不是class类型值对对象的引用。a struct的值是的实例字段的所有值的“联合” struct。
现在,struct类型的默认值是所有这些字段都有其默认值的值。从C#开始,语法如下:
new S() // S is a value-type
Run Code Online (Sandbox Code Playgroud)
where S是一个结构类型,已等效于该结构的默认值。没有构造函数调用!这是可以(现在)写入的完全相同的值
default(S) // S is a value-type
Run Code Online (Sandbox Code Playgroud)
现在,诸如
struct S
{
int field = 42; // non-static field with initializer, disallowed!
// ...
}
Run Code Online (Sandbox Code Playgroud)
是非法的(在结构中不能有实例字段初始化器)。他们可能给人的印象是,field一个new S()会42,但实际上field的new S()必须是默认值int(它是一个零,从不同的42)。
通过此说明,您还将看到为什么无法在C#中为结构类型创建非静态的,零参数的构造函数。