C#Struct数组但不是类数组

时间:2014-03-05 20:32:42

标签: c#

我能够创建一个我创建的 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

2 个答案:

答案 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();