我在一个类中有一个静态函数。
每当我尝试使用非静态数据成员时,都会出现以下编译错误。
非静态字段、方法或属性成员需要对象引用
为什么会这样?
非静态成员属于一个实例。如果不以某种方式解决您正在谈论的类的哪个实例,这是没有意义的。在静态上下文中,您没有实例,这就是为什么您不能在不明确提及对象引用的情况下访问非静态成员。
事实上,您可以通过显式指定对象引用来访问静态上下文中的非静态成员:
class HelloWorld {
int i;
public HelloWorld(int i) { this.i = i; }
public static void Print(HelloWorld instance) {
Console.WriteLine(instance.i);
}
}
var test = new HelloWorld(1);
var test2 = new HelloWorld(2);
HelloWorld.Print(test);
如果没有在方法中明确引用实例,Print
它怎么知道它应该打印 1 而不是 2?
实例方法依赖于该特定实例的状态才能运行。
假设您有此类具有您描述的场景:
class Person
{
static PrintName()
{
// Not legal, but let's say it is for now.
Console.WriteLine(Name);
}
private Name { get; set; }
}
希望问题现在很明显。因为 Name 是一个实例成员,所以您需要一个类的实际实例,因为 Name 在不同的实例中可能不同。
因此,未附加到实例的静态方法不知道要使用哪个实例。您必须明确指定哪个。
静态方法不能直接访问类的任何非静态成员变量。
毕竟:即使类的实例不存在,也可以调用静态方法。你想如何访问一个不存在的实例上的成员变量?
(当然,正如 Mehrdad 指出的那样:您可以将类的实例传递给静态方法并访问该实例上的所有内容 - 但这不是您在说的,对吧?)
静态函数只能使用静态成员,并且调用静态函数。
如前所述,静态函数可以对类实例进行操作,但不能从类实例中操作(因为缺少更具描述性的词)。例如:
class MyClass
{
public int x;
public static int y;
public static void TestFunc()
{
x = 5; // Invalid, because there is no 'this' context here
y = 5; // Valid, because y is not associated with an object instance
}
public static void TestFunc2(MyClass instance)
{
instance.x = 5; // Valid
instance.y = 5; // Invalid in C# (valid w/ a warning in VB.NET)
}
}
“非静态数据成员”的定义将是“实例数据成员”。换句话说,非静态成员属于您的类的创建实例。
静态方法不在类的任何特定实例的上下文中运行。因此,当您要求此类方法使用非静态成员时,它将不知道应该尝试从类的 0 个或多个实例中的哪个实例中获取数据。