Почему может я только доступ статические участники от статической функции?

У меня есть статическая функция в классе.

каждый раз, когда я пытаюсь использовать не статический элемент данных, я получаю следующую ошибку компиляции.

Ссылка на объект требуется для нестатического поля, метода или участника свойства

Почему это ведет себя как этот?

14
задан danben 17 February 2010 в 18:27
поделиться

6 ответов

Нестатический член принадлежит экземпляру. Это бессмысленно без того, чтобы как-то определить, о каком экземпляре класса вы говорите. В статическом контексте у вас нет экземпляра, поэтому вы не можете получить доступ к нестатическому члену без явного упоминания ссылки на объект.

На самом деле, вы можете получить доступ к нестатическому члену в статическом контексте, явно указав ссылку на объект:

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?

19
ответ дан 1 December 2019 в 09:01
поделиться

Методы экземпляра зависят от состояния этот конкретный экземпляр для запуска.

Допустим, у вас есть класс, сценарий которого вы описываете:

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

    private Name { get; set; }
}

Надеюсь, теперь проблема очевидна. Поскольку Name является членом экземпляра , вам нужен фактический экземпляр класса, поскольку Name может отличаться в разных экземплярах.

Из-за этого статический метод, который не прикреплен к экземпляру, не знает , какой экземпляр использовать. Вы должны четко указать, какой именно.

5
ответ дан 1 December 2019 в 09:01
поделиться

Статический метод не может напрямую обращаться к нестатическим переменным-членам класса.

В конце концов: статический метод может быть вызван без наличия экземпляра класса. Как вы хотите получить доступ к переменной-члену в несуществующем экземпляре ??

(конечно, как указал Мердад: вы можете передать экземпляр своего класса статическому методу и получить доступ ко всему в этом экземпляре, но это не то, о чем вы говорите, верно?)

2
ответ дан 1 December 2019 в 09:01
поделиться

Вы не можете получить доступ к нестатическим данным из статической функции. Это связано с тем, что статическая функция может быть вызвана независимо от того, есть ли какие-либо экземпляры объектов класса. Однако нестатические данные зависят от конкретного объекта (экземпляра) класса. Поскольку вы не можете быть уверены, что существуют какие-либо объекты, экземпляры которых создаются при вызове статической функции, нелогично (и, следовательно, не разрешено) получать доступ к нестатическим данным из нее.

Этот вопрос задавался несколько раз по SO в разных формах / для разных языков:

1
ответ дан 1 December 2019 в 09:01
поделиться

Нестатический член принадлежит экземпляру. Это бессмысленно, так и не разрешив, о каком экземпляре класса вы говорите. В статическом контексте экземпляр отсутствует, поэтому доступ к нестатическому члену невозможен без явного упоминания ссылки на объект.

Фактически, вы можете получить доступ к нестатическому члену в статическом контексте, указав ссылку на объект явно:

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);

Без явной ссылки на экземпляр в методе Печать , как бы он знал, что он должен печатать 1, а не 2?

-121--2451616-

Статические функции могут использовать только статические членов и вызывать статические функции.

Как уже упоминалось, статическая функция может работать над экземпляром класса, но не от в экземпляре класса (из-за отсутствия более описательного слова). Например:

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)
    }
}
-121--2451619-

Определение «нестатического члена данных» будет «элементом данных экземпляра». Другими словами, нестатические члены принадлежат созданному экземпляру класса.

Статический метод не выполняется в контексте какого-либо конкретного экземпляра класса. Следовательно, когда вы попросите такой метод использовать нестатический член, он не будет иметь понятия, из какого из 0 или более экземпляров класса он должен попытаться получить данные.

1
ответ дан 1 December 2019 в 09:01
поделиться

Статические функции могут использовать только статические члены и вызывать статические функции.

Как уже упоминалось, статическая функция может работать на экземпляре класса, но не из внутри экземпляра класса (за неимением более описательного слова). For example:

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)
    }
}
2
ответ дан 1 December 2019 в 09:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: