“重新访问非静态字段需要对象引用”

时间:2012-05-22 23:22:17

标签: c# oop

In a previous question我询问了主题标题错误消息,答案几乎是显而易见的。

然而,“煮沸”的例子来自一些不那么稀释的代码,现在原来的问题在我的新汤中再次出现。

我怀疑我可能会对很多“有趣”的评论开放,但是嘿......没有愚蠢的问题,只有愚蠢的程序员!“

无论如何,这是原始代码的一个只是略微煮沸的版本:

public partial class Form1 : Form
{
    public static Form1 mForm = new Form1();


    // define textbox parameter structure
    struct ParmStruct
    {
        public TextBox sTextBoxName;
        public double dMinValue;
        public double dMaxValue;

        public ParmStruct(TextBox sTextBoxName, double dMinValue, double dMaxValue)
        {
            this.sTextBoxName = sTextBoxName;
            this.dMinValue = dMinValue;
            this.dMaxValue = dMaxValue;
        }
    }

    // Create list of Parameters (name, min, max)
    static ParmStruct[] ParmList = new ParmStruct[]
    {
        new ParmStruct { sTextBoxName = mForm.textBox1, dMinValue = -99, dMaxValue = 99 },
        new ParmStruct { sTextBoxName = textBox2, dMinValue = 0, dMaxValue = 100 } 
    };

    public Form1()
    {
        InitializeComponent();

        this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); 
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        TextBox tb1;

        tb1 = mForm.textBox1;
        tb1 = textBox2;

        double x = ParmList[0].dMaxValue;
    }
}

ParmList初始化(sTextBoxName = textBox2)的第二行将无法编译,除非我将其sTextBoxName = mForm.textBox2.

但是,行tb1 = textBox2将编译,而不需要mForm。前缀。

这是最初引起混淆的实际案例(就我而言仍然如此)。

不确定为什么编译器(VS 2010)可以在一个案例中找到它而不是另一个案例。

哦......代码在编译时确实有效。 :)

2 个答案:

答案 0 :(得分:2)

这是一个问题。

// Create list of Parameters (name, min, max)
static ParmStruct[] ParmList = new ParmStruct[]
{
    new ParmStruct { sTextBoxName = mForm.textBox1, dMinValue = -99, dMaxValue = 99 },
    new ParmStruct { sTextBoxName = textBox2, dMinValue = 0, dMaxValue = 100 } 
};

Form1的所有实例(这是static关键字的作用)之间共享此变量没有任何意义,因为表单的每个实例都有自己的唯一textBox2。此外,正如克里斯所建议的那样,简单地删除static关键字也不是一个修复方法。在textBox2创建之前,您无法引用InitializeComponent,而Form1内部会发生这种情况(由// list of Parameters (name, min, max) ParmStruct[] ParmList; public Form1() { InitializeComponent(); // now the textboxes exist and can be associated with the structure ParmList = new ParmStruct[] { new ParmStruct { sTextBoxName = textBox1, dMinValue = -99, dMaxValue = 99 }, new ParmStruct { sTextBoxName = textBox2, dMinValue = 0, dMaxValue = 100 } }; this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); } 构造函数调用)。这会更好:

textBox1_TextChanged

在构造函数和textBox1方法中,您可以在没有任何进一步限定的情况下引用textBox2this,编译器将找到属于this.textBox1对象的那些就像你输入mForm一样(参见例如构造函数的最后一个)。编译器不会使用mForm中的文本框。事实上,静态{{1}}字段没有理由,因为没有代码可以显示它。

答案 1 :(得分:0)

textBox2是一个仅存在于mForm上下文中的对象,因此您必须将其作为mForm的字段进行范围,因为它尚未在您的方法中声明或作为类中的[静态]对象。