gpt4 book ai didi

C# 结构数组但不是类数组

转载 作者:行者123 更新时间:2023-11-30 13:46:19 25 4
gpt4 key购买 nike

我能够创建一个由我创建的结构 组成的数组,但是我在为一个 的数组做同样的事情时遇到了麻烦。我(隐约地)意识到 this probably isn't the best way to do this ,但如果能帮助我弄清楚发生了什么,我将不胜感激。

我已经学习 C# 大约 2 天了,我正在远离 MS Office-VBA,如果这能让您了解我的兴趣。无论如何,我正在关注 online reference ,并在此过程中尝试使用我到目前为止所学的知识。这个问题是我玩的结果。

首先,让我用一些代码片段描述一下我对结构和该结构的数组所做的工作。

我已经能够创建一个名为 Machines 的结构...

// 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

然后,我可以创建一个结构数组,然后一切顺利:

// 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 .

最佳答案

类为您提供 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 .

关于C# 结构数组但不是类数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22208587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com