none
请教高手!关于变量传递的问题! RRS feed

  • 问题

  • 在Form2(下面的代码)中的变量t和数组A要在Form1中调用,但通过下面的语句为什么不能将通过button1_Click赋给t的值传递到数组A的长度中呢?请教高手赐教!

    namespace aaa
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
            public static int t;

          public  void button1_Click(object sender, EventArgs e)
            {
                if (numericUpDown1.Value != 0)
                {

                    t = Convert.ToInt32(numericUpDown1.Value);
                }
                else
                    MessageBox.Show("请输入数值");
                MessageBox.Show(t.ToString());

            }
           
           
          public static string[] A = new string[t];
         

          private void button3_Click(object sender, EventArgs e)
          {
              MessageBox.Show(A.Length.ToString());
          }
          
        }
    }

    2008年8月28日 14:04

答案

  •  

    public static int t;


            public static string[] A;

          public  void button1_Click(object sender, EventArgs e)
            {
                if (numericUpDown1.Value != 0)
                {

                    t = Convert.ToInt32(numericUpDown1.Value);

     A = new string[t];

                }
                else
                    MessageBox.Show("请输入数值");
                MessageBox.Show(t.ToString());

            }

    2008年8月29日 7:11
    版主

全部回复

  • 你好!
       这个问题涉及到静态变量的初始化,实际上静态变量是在编译器自动为类产生的静态构造器中初始化的,这个静态构造器是在类第一次被访问时就被调用了,回到你的问题,在Form2类第一次被访问之前,已经调用了静态构造器(在第一个实例被创建之前),这时由于你并没有为t进行初始化,所以t被初试化为0,这时A被初始化为一个0长的数组,然后Form2才被实例化,然后你按button1按钮,t确实被赋值为你输入的值,但这跟A的初始化已经没有关系了,A的初始化已经在静态构造器中执行完毕了。所以你的t值没有赋给A作为数组的长度。背后的原理就是这样。
        有些时候事情并不像我们看到的那样!但是一切奇怪的现象背后都有他的道理。
        希望以上回答对你有帮助!
    2008年8月29日 2:43
    版主
  • 伟大的周雪峰先生,首先谢谢你的答复,要知道你的答复对我真的是有很大的帮助!

     

    但是 我现在就存在一个问题,我在程序中定义的静态变量t和静态数组A都是要在Form1中调用的,而t的赋值要用一个按钮来确定实现,那么按照静态变量初始化的原理,我该怎么样给t赋值才能利用它定义一个静态数组A,或者我该怎么样定义一个数组A,让它不但可以接受到t的值又能在Form1中调用呢?

     

    再次感谢你的帮助!

    2008年8月29日 6:15
  •  

    public static int t;


            public static string[] A;

          public  void button1_Click(object sender, EventArgs e)
            {
                if (numericUpDown1.Value != 0)
                {

                    t = Convert.ToInt32(numericUpDown1.Value);

     A = new string[t];

                }
                else
                    MessageBox.Show("请输入数值");
                MessageBox.Show(t.ToString());

            }

    2008年8月29日 7:11
    版主
  •  

    谢谢啊! 真是太感谢了! 我明白了,搞定了!
    2008年8月29日 9:22