我能够创建一个我创建的 struct 的数组,但是我在为类的数组做同样的事情时遇到了麻烦。我(微弱地)意识到this probably isn't the best way to do this,但我很感激帮助弄清楚发生了什么。
我在学习C#大约2天了,而且我正在离开MS Office-VBA,如果这可以让你了解我的内容。无论如何,我正在追踪一个online reference,并一路试图玩到目前为止我学到的东西。这个问题是我演奏的结果。
首先,让我描述一下我对结构体所做的事情,以及该结构体的数组,以及一些代码片段。
我已经能够创建一个名为Machines ...
的 struct// play with structs
struct Machines
{
// vars for struct
private string model, SN;
private int hours;
// assign values
public void AssignValues(string model_in, string SN_in, int hours_in)
{
model = model_in;
SN = SN_in;
hours = hours_in;
}
// display values
public void DisplayValues()
{
Console.WriteLine("Model: {0}", model);
Console.WriteLine("SN: {0}", SN);
Console.WriteLine("Hours: {0}", hours);
}
};
......事情似乎工作正常:
public static void Main()
{
// play with structures
Machines machine1 = new Machines();
machine1.AssignValues("AA", "ABC01234", 34760);
machine1.DisplayValues();
输出是:
Model: AA
SN: ABC01234
Hours: 34760
然后,我可以创建一个struct的数组,并且事情继续顺利进行:
// play with structures and arrays
// declare, create new instance
Machines [] MyArr = new Machines[10];
MyArr[0].AssignValues("AA", "ABC01235", 43000);
MyArr[0].DisplayValues();
但是,当我尝试用类做同样的事情时,这是一个不同的故事。发生了什么事?
public class ArmstrongMachine
{
// vars for struct
private string model, SN;
private int hours;
// assign values
public void AssignValues(string model_in, string SN_in, int hours_in)
{
model = model_in;
SN = SN_in;
hours = hours_in;
}
// display values
public void DisplayValues()
{
Console.WriteLine("Model: {0}", model);
Console.WriteLine("SN: {0}", SN);
Console.WriteLine("Hours: {0}", hours);
}
};
...
// play with classes
ArmstrongMachine [] MyMachines = new ArmstrongMachine[10];
MyMachines[0].AssignValues("AA", "ABC01236", 51000);
MyMachines[0].DisplayValues();
问题似乎始于MyMachines[0].AssignValues...
。如果我注释掉该行和以下内容,则没有问题(除了警告我创建了一个我不使用的变量)。
有什么想法吗?
此外,请注意这是compiled online。
答案 0 :(得分:7)
一个类为您提供C#中的引用类型。
因此,数组将引用保存到对象,而不是对象本身。
数组最初不包含任何零,全部为零,这意味着所有引用都将为null
。
您需要初始化数组的每个元素以保存对象引用:
// play with classes
ArmstrongMachine [] MyMachines = new ArmstrongMachine[10];
MyMachines[0] = new ArmstrongMachine();
MyMachines[0].AssignValues("AA", "ABC01236", 51000);
MyMachines[0].DisplayValues();
MyMachines[1] = new ArmstrongMachine();
MyMachines[2] = new ArmstrongMachine();
...
MyMachines[9] = new ArmstrongMachine();
如果数组包含值类型(如结构体),则数组本身保存结构值,因此它适用于结构体,而不适用于对象。
另请注意,您应该强调不使用可变结构(您可以更改的结构)。有吨的东西可能会出错并咬你...所以你不应该使用它们。在这种情况下,请使用课程。
以下是关于可变结构主题的视频:Evil Structs, by Jon Skeet。
答案 1 :(得分:2)
简单来说:结构只是内存结构的一种方式,而类是一个真实的对象。对于第二个示例,您需要先创建类的实例,然后才能调用它,因为它只指向一个内存位置(可能是未分配的=空引用):
ArmstrongMachine [] MyMachines = new ArmstrongMachine[10];
MyMachines[0] = new ArmstrongMachine();
MyMachines[0].AssignValues("AA", "ABC01236", 51000);
MyMachines[0].DisplayValues();