C#Struct数组但不是类数组

Aar*_*mas 3 c#

我能够创建一个我创建的结构数组,但是我在为的数组做同样的事情时遇到了麻烦.我(微弱地)意识到这可能不是最好的方法,但我很感激帮助弄清楚发生了什么.

我大约需要2天时间学习C#,而且我正在离开MS Office-VBA,如果这能让你知道我在做什么.无论如何,我正在关注一个在线参考,并一直试图玩到目前为止我学到的东西.这个问题是我演奏的结果.

首先,让我用一些代码片段描述我对struct所做的事情,以及该结构的数组.

我已经能够创建一个名为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);
    }
};
Run Code Online (Sandbox Code Playgroud)

......事情似乎工作得很好:

public static void Main()
{
    // play with structures
    Machines machine1 = new Machines();
    machine1.AssignValues("AA", "ABC01234", 34760);
    machine1.DisplayValues();
Run Code Online (Sandbox Code Playgroud)

输出是:

Model: AA
SN: ABC01234
Hours: 34760
Run Code Online (Sandbox Code Playgroud)

然后,我可以创建一个struct的数组,事情继续顺利:

// play with structures and arrays
// declare, create new instance
Machines [] MyArr = new Machines[10];
MyArr[0].AssignValues("AA", "ABC01235", 43000);
MyArr[0].DisplayValues();
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在课堂上做同样的事情时,这是一个不同的故事.这是怎么回事?

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);
    }
};
Run Code Online (Sandbox Code Playgroud)

...

    // play with classes
    ArmstrongMachine [] MyMachines = new ArmstrongMachine[10];
    MyMachines[0].AssignValues("AA", "ABC01236", 51000);
    MyMachines[0].DisplayValues();
Run Code Online (Sandbox Code Playgroud)

这个问题似乎始于MyMachines[0].AssignValues....如果我注释掉该行和以下内容,则没有问题(除了警告我创建了一个我不使用的变量).

有任何想法吗?

此外,请注意这是在线编译.

ang*_*son 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();
Run Code Online (Sandbox Code Playgroud)

如果数组包含值类型(如结构),则数组本身保存结构值,因此它适用于结构,而不是对象.

另请注意,您应该强调不要使用可变结构(您可以更改的结构).有的东西,可以去错了,咬你......所以你不应该使用它们.在这种情况下使用类.

这是一个关于可变结构主题的视频:邪恶的结构,由Jon Skeet.