0

我在使用“Form1_Load”中声明的数组时遇到问题。我的目标是能够为数组分配值,然后从其中的某些值中减去。

该数组是一个结构数组。我在想我必须在其他地方公开声明该数组。现在我想尝试在“Form1_load”中完成大部分工作。

我想要实现的是,如果用户单击图片,它应该更新剩余的项目数量(从 20 开始)并将总数添加到标签中。他们可以单击 5 张不同的图片来执行此操作,这就是需要阵列的地方。

结构:

     struct Drink
    {
        public string name;
        public int cost;
        public int numberOfDrinks = 20;
    }
  • 该结构位于命名空间内,位于分部类之上。*

加载事件:

        private void Form1_Load(object sender, EventArgs e)
    {
        const int SIZE = 5;
        Drink[] drink = new Drink[SIZE];


    }
  • 这是我想要数组的地方*

以下是单击图片时应发生的情况的示例:

        private void picCola_Click(object sender, EventArgs e)
    {
        drink[0].cost = 1.5;
        drink[0].name = "";
    }
  • 但是,会出现消息“名称 'drink' 在当前上下文中不存在”。数组是否需要公开?
4

3 回答 3

6

当您在函数 Form1_Load 中声明数组 Drink 时,它仅成为该函数的本地函数。没有人能看到它。您需要将变量的范围更改为全局(不需要公开)。

private Drink[] drink;
private void Form1_Load(object sender, EventArgs e)
    {
        const int SIZE = 5;
        drink = new Drink[SIZE];
    }

但是,您可以在其他地方实例化它。

于 2013-10-07T17:18:40.703 回答
5
public partial class Form1 : Form
{
    public Drink[] drinks;
    public const int SIZE = 5;

    private void Form1_Load( object sender, EventArgs e )
    {
        drinks = new Drink[ SIZE ];
    }

    private void picCola_Click( object sender, EventArgs e )
    {
        drinks[0].cost = 1.5;
        drinks[0].name = "";
    }
}

您需要正确确定对象的范围!通过在 中声明它,在Form1_Load调用其他方法时它不存在。您必须将它放在类的范围级别(从而使其成为类的字段。这样它对所有调用的方法都是可见的Form1。范围由花括号表示:{}。考虑以下内容:

{
    int a = 7;
    {
        int b = 5;
        {
            int c = 6;

            a = 1; // OK: a exists at this level
            b = 2; // OK: b exists at this level
            c = 3; // OK: c exists at this level
        }

        a = 1; // OK: a exists at this level
        b = 2; // OK: b exists at this level
        c = 3; // WRONG: c does not exist at this level
    }

    a = 1; // OK: a exists at this level
    b = 2; // WRONG: b does not exist at this level
    c = 3; // WRONG: c does not exist at this level
}

a = 1; // WRONG: a does not exist at this level
b = 2; // WRONG: b does not exist at this level
c = 3; // WRONG: c does not exist at this level
于 2013-10-07T17:18:56.753 回答
0

结构类型的变量或存储位置本质上是用胶带粘在一起的一堆变量。如果一个人声明struct pair{public int X,Y};,那么一个人就是指定变量声明pair myPair;将有效地声明两个int变量myPair.X——并且myPair.Y——尽管人们可以pair在方便时使用它们。如果声明 a pair[] myArray,则数组的每个项目myArray[index]将包含两个整数myArray[index].XmyArray[index].Y

其目的是表现为一堆用胶带粘在一起的变量的结构应该简单地将这些变量声明为公共字段(暴露字段结构是表示该行为的最佳数据类型)。用于其他目的的结构通常应遵循 MS 指南。我不太清楚你打算如何使用你的数据类型,所以我不能说结构是否合适,尽管试图初始化numberOfDrinks在结构定义中不起作用。类对象实例和它们的字段只有在一个类被要求创建一个自身的实例时才存在——一个类可以控制的过程。相比之下,结构定义指示结构类型的存储位置应该被视为用胶带粘在一起的一堆变量,但它是该存储位置的所有者,而不是结构类型,它可以控制其创建。

于 2013-10-07T17:51:42.750 回答