【问题标题】:assigning classes to an array of structs c#将类分配给结构数组c#
【发布时间】:2013-10-07 17:16:00
【问题描述】:

我在使用“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'”。数组需要公开吗?

【问题讨论】:

标签: c# arrays struct


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-24
        • 1970-01-01
        • 2021-03-19
        • 1970-01-01
        • 2021-06-24
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多