【问题标题】:public int loses value after an action is completedpublic int 在动作完成后失去价值
【发布时间】:2014-02-23 07:34:56
【问题描述】:

我的int(在dataStorage.cs 的单独类中声明)在此操作完成后失去其价值:

private void button1_Click(object sender, EventArgs e)
{
    dataStore dataStore = new dataStore();

    dataStore.position = Convert.ToInt32(numericUpDown1.Value);

} // <= right here the value is reset to 0

我想做的是在表单之间传递值。但是当另一个表单开始它的进程时,我的dataStorage.position 失去了它的值并重置为“0”。

如何在表单之间正确传递值?

【问题讨论】:

  • @Brandon 它是位置。声明为public int position = 0;
  • 标准 C# 命名约定是方法和类是 PascalCase。

标签: c# winforms storage pass-by-reference


【解决方案1】:

你还没有对dataStore 做任何事情。听起来您想为您实际未使用的dataStorage 实例设置position 的值。您需要将dataStorage 的实例设置为您在该按钮中创建的实例,以使其保留其值。

【讨论】:

    【解决方案2】:

    这是因为您正在创建一个本地存储变量,该变量会立即超出范围。

    将其声明为表单类的一部分:

    public class MyForm : Form
    {
        public dataStore _dataStore = new dataStore();
    
        public MyForm() { }
    
        private void button1_click(Object sender, EventArgs e)
        {
            _dataStore.position = Convert.ToInt32(numericUpDown1.Value);
        }
    }
    

    【讨论】:

      【解决方案3】:

      这种行为实际上是意料之中的。 当您实例化一个对象时,它仅在创建它的上下文中具有作用域。

      private void button1_Click(object sender, EventArgs e)
      {
          dataStore dataStore = new dataStore();
      
          dataStore.position = Convert.ToInt32(numericUpDown1.Value);
      
      } // When this function returns, dataStore no longer exists!
      

      在这种情况下,您的 dataStore 对象仅存在于按钮单击处理程序中。

      您要做的是将 DataStore 声明为您的类的私有成员,然后在单击处理程序中分配值。

      private dataStore dataStore = new dataStore();
      
      private void button1_Click(object sender, EventArgs e)
      {
          dataStore.position = Convert.ToInt32(numericUpDown1.Value);
      
      } // <= right here the value is reset to 0
      

      C# 中的实际类名也应该为每个单词(PascalCase)有一个大写字母,而不是小写第一个字母后跟大写的其余单词(camelCase):

      class DataStore { }
      ...
      private DataStore dataStore = new DataStore();
      

      【讨论】:

        【解决方案4】:

        您不会将值保留在任何持久的位置。以下是您正在执行的操作的说明:

        private void button1_Click(object sender, EventArgs e)
        {
            // You've called a function, in this case a click handler
        
            // Here you create an instance of `dataStore`
            // This instance exists *only* within the scope of this function
            dataStore dataStore = new dataStore();
        
            // Here you set a value on that instance
            dataStore.position = Convert.ToInt32(numericUpDown1.Value);
        }
        // Now that the function has ended, any variables which were declared
        // within the scope of the function are now out of scope, and removed
        // from memory.
        

        从这段代码中不清楚的是值应该如何被持久化。有很多选择:

        1. 将值声明为静态,在这种情况下,您不需要创建新实例。静态值可以在代码中的任何位置使用。
        2. 将值存储在一些持久性介质中,例如数据库。基本上,您会将您的 dataStore 对象提交到持久性并在其他地方检索它。
        3. 将您的 dataStore 实例作为方法参数传递给您接下来要调用的任何内容。
        4. dataStore 声明为此表单的类级成员并在其他方法中引用它。

        很可能(但同样,我们无法从这段代码中确定)您想要第四个选项。在您的表单上看起来像这样:

        public class YourForm : Form
        {
            private dataStore dataStore = new dataStore();
        
            private void button1_Click(object sender, EventArgs e)
            {
                dataStore.position = Convert.ToInt32(numericUpDown1.Value);
            }
        
            private void YourOtherMethod()
            {
                // dataStore.position will have a value after the button
                // click handler is executed
            }
        }
        

        这里的重点是考虑对象实例。将类视为对象的“蓝图”。当您创建new 对象时,您正在基于该蓝图构建一个实例。该实例现在在系统中是唯一的,如果您需要在代码的其他地方访问它,则需要以某种方式在系统中传递该实例。

        【讨论】:

        • 但我需要在表单之间传递它,就像我说的那样。所以私人空隙不会为此工作。同样,当我检查 dataStore.cs 中的值时,在 btn 单击方法再次完成后,它又回到了 0。
        • @user3002135:表单之间的关系如何?第二个表单在哪里创建/显示?您可以将dataStore 添加到另一个表单的构造函数中,您可以将其作为参数公开在此表单上,并在其他表单的构造函数中添加对此表单的引用等。您能否详细说明您的问题并包含更多代码关于这个其他形式?现在,您的问题中只有一种形式。此外,没有“dataStore.cs 中的值”,在此表单上创建的 instance 中有一个值。
        猜你喜欢
        • 2013-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多