Почему я могу получить доступ только к статическим членам из статической функции?
У меня есть статическая функция в классе.
всякий раз, когда я пытаюсь использовать нестационарный элемент данных, я получаю следующую ошибку компиляции.
Ссылка на объект требуется для нестатического поля, метода или элемента свойства
Почему это так?
Ответы
Ответ 1
Нестатический член принадлежит экземпляру. Это бессмысленно без какого-либо разрешения какого экземпляра класса, о котором вы говорите. В статическом контексте у вас нет экземпляра, поэтому вы не можете получить доступ к нестатическому элементу без явного упоминания ссылки на объект.
Фактически вы можете обращаться к нестатическому члену в статическом контексте, явно указав ссылку на объект:
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?
Ответ 2
Методы экземпляров полагаются на состояние этого конкретного экземпляра для запуска.
Скажем, у вас был этот класс, который описывает сценарий:
class Person
{
static PrintName()
{
// Not legal, but let say it is for now.
Console.WriteLine(Name);
}
private Name { get; set; }
}
Надеюсь, проблема очевидна сейчас. Поскольку Name является членом экземпляра, вам нужен фактический экземпляр класса, поскольку имя может быть различным в разных экземплярах.
Из-за этого статический метод, который не привязан к экземпляру, не знает, какой экземпляр использовать. Вы должны быть явным, указав, какой из них.
Ответ 3
Статический метод не может напрямую обращаться к нестационарным переменным-членам класса.
В конце концов: статический метод можно вызвать без экземпляра класса, даже находящегося в существовании. Как вы хотите получить доступ к переменной-члену в несуществующем экземпляре?
(конечно, как отметил Мехрдад: вы можете передать экземпляр своего класса статическому методу и получить доступ ко всему этому экземпляру, но это не то, о чем вы говорите, не так ли?)
Ответ 4
Статические функции могут использовать только статические элементы и вызывать статические функции.
Как уже упоминалось, статическая функция может работать на экземпляре класса, но не внутри экземпляра класса (из-за отсутствия более описательного слова). Например:
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)
}
}
Ответ 5
Вы не можете получить доступ к нестационарным данным из статической функции. Это связано с тем, что статическая функция может быть вызвана независимо от того, существуют ли какие-либо объекты объекта класса. Однако нестатические данные зависят от конкретного объекта (экземпляра) класса. Поскольку вы не можете быть уверены, что есть какие-либо объекты, созданные при вызове статической функции, это нелогично (и, следовательно, не разрешено) для доступа к нестационарным данным из него.
Этот вопрос задавался несколько раз на SO в разных формах/для разных языков:
Ответ 6
Определение "нестатического элемента данных" будет "членом данных экземпляра". Другими словами, нестатические члены принадлежат к созданному экземпляру вашего класса.
Статический метод не запускается в контексте какого-либо конкретного экземпляра класса. Следовательно, когда вы просите такой метод использовать нестационарный член, он не знает, из какого из 0 или более экземпляров класса он должен попытаться получить данные.