C# VS2010 - 为什么我会收到消息“非静态字段需要对象引用”

本文关键字:字段 静态 对象引用 消息 为什么 VS2010 | 更新日期: 2023-09-27 18:34:48

我将这个问题归结为一个非常简单的程序:

public Form1()
{
    InitializeComponent();
    TextBox tb1;
    tb1 = textBox1;             // this line is OK
    tb1 = this.textBox1;        // this line is OK
    tb1 = Form1.textBox1;       // this line generates error message    
    }

如果将鼠标悬停在"textBox1"、"this.textBox1"和"Form1.textBox1"上,则在所有情况下,工具提示都会显示"TextBox Form1.textBox1"。

(有关显示工具提示的屏幕转储,请参阅 www.firish.com/tb1.jpg 和 www.firish.com/tb2.jpg(

我在办公室里传递了一下,但这里没有人能真正解释为什么第三个示例无法编译,但除了"嗯","嗯......"之外没有太多其他内容。耸了耸肩。

C# VS2010 - 为什么我会收到消息“非静态字段需要对象引用”

因为 Form1

是类的名称,而不是 Form1 的实例。

创建类时,代码如下所示

Form1 f = new Form1();

这里f是类 Form1 的实例,您可以使用(前提是文本框 1 可见(

TextBox tb1 = f.TextBox1;

在类 Form1 中,您可以使用关键字 this 引用当前实例

因为使用此语法,您只能访问static成员。 textBox1 是一个动态成员,只能从初始化的对象访问。 myObject.textBox1 .你正在尝试做MyClass.textBox1.

textBox1 是一个实例变量。 它必须存在于对象的实例化副本中。 当你说这样的话时,就会发生这种情况:

Form1 form new Form1();
form.textBox1 = "Something";

如果不实例化对象,则它正在使用静态调用,并且不能静态调用作为实例变量的对象。

Form1.textBox1 = "Something"; // this fails.

在您的情况下,您使用的是构造函数。 构造函数仅在对象实例化时被调用,因此使用 this(或隐含的 this(有效,但使用静态调用则不然,因为没有实例可以分配变量。