为什么我只能从静态函数访问静态成员?

Nov*_*per 14 c# static-methods

我在类中有一个静态函数.

每当我尝试使用非静态数据成员时,我都会遇到编译错误.

非静态字段,方法或属性成员需要对象引用

为什么它表现得那样?

Meh*_*ari 19

非静态成员属于实例.如果没有以某种方式解决你正在谈论的课程的哪个实例,这是没有意义的.在静态上下文中,您没有实例,这就是为什么在没有明确提及对象引用的情况下无法访问非静态成员的原因.

实际上,您可以通过显式指定对象引用访问静态上下文中的非静态成员:

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);
Run Code Online (Sandbox Code Playgroud)

如果没有明确引用方法中的实例,Print它怎么知道它应该打印1而不是2?

  • @marc_s:我知道OP在想什么.我认为这种回答方式可以更有效地澄清原因.它证明它不是对静态方法施加的某种任意限制,而是它可以解决的唯一方法. (4认同)

cas*_*One 5

实例方法依赖于该特定实例的状态才能运行.

假设你有这个类,它有你描述的场景:

class Person
{
    static PrintName()
    {
        // Not legal, but let's say it is for now.
        Console.WriteLine(Name);
    }

    private Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

希望现在问题很明显.因为Name是实例成员,所以您需要该类的实际实例,因为Name可以在不同实例之间不同.

因此,静态方法(未附加到实例)不知道要使用哪个实例.你必须明确指定哪一个.