繁体   English   中英

将类分配给结构体数组c#

[英]assigning classes to an array of structs c#

使用“ 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'在当前上下文中不存在”。 阵列需要公开吗?

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

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

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

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

结构类型的变量或存储位置本质上是一堆用胶带粘在一起的变量。 如果声明了struct pair{public int X,Y}; 然后指定变量声明pair myPair; 将有效地声明两个int变量myPair.XmyPair.Y尽管在方便时一个变量可以pair使用。 如果声明了pair[] myArray ,则数组的每个项目myArray[index]将保存两个整数,即myArray[index].XmyArray[index].Y

目的是充当一堆用胶带粘在一起的变量的结构,应简单地将这些变量声明为公共字段(暴露字段结构是表示该行为的最佳数据类型)。 用于其他目的的结构应经常遵循MS准则。 我不太清楚您打算如何使用数据类型,因此尽管尝试在结构定义中初始化numberOfDrinks无效,但我不能说结构是否合适。 类对象实例及其字段仅在要求类创建其自身实例时才存在-该过程由类控制。 相反,结构定义指示应将结构类型的存储位置视为一堆与胶带绑在一起的变量,但它是该存储位置的所有者,而不是对其类型具有控制权的结构类型创建。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM