У меня есть статическая функция в классе.
каждый раз, когда я пытаюсь использовать не статический элемент данных, я получаю следующую ошибку компиляции.
Ссылка на объект требуется для нестатического поля, метода или участника свойства
Почему это ведет себя как этот?
Нестатический член принадлежит экземпляру. Это бессмысленно без того, чтобы как-то определить, о каком экземпляре класса вы говорите. В статическом контексте у вас нет экземпляра, поэтому вы не можете получить доступ к нестатическому члену без явного упоминания ссылки на объект.
На самом деле, вы можете получить доступ к нестатическому члену в статическом контексте, явно указав ссылку на объект:
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 может отличаться в разных экземплярах.
Из-за этого статический метод, который не прикреплен к экземпляру, не знает , какой экземпляр использовать. Вы должны четко указать, какой именно.
Статический метод не может напрямую обращаться к нестатическим переменным-членам класса.
В конце концов: статический метод может быть вызван без наличия экземпляра класса. Как вы хотите получить доступ к переменной-члену в несуществующем экземпляре ??
(конечно, как указал Мердад: вы можете передать экземпляр своего класса статическому методу и получить доступ ко всему в этом экземпляре, но это не то, о чем вы говорите, верно?)
Вы не можете получить доступ к нестатическим данным из статической функции. Это связано с тем, что статическая функция может быть вызвана независимо от того, есть ли какие-либо экземпляры объектов класса. Однако нестатические данные зависят от конкретного объекта (экземпляра) класса. Поскольку вы не можете быть уверены, что существуют какие-либо объекты, экземпляры которых создаются при вызове статической функции, нелогично (и, следовательно, не разрешено) получать доступ к нестатическим данным из нее.
Этот вопрос задавался несколько раз по SO в разных формах / для разных языков:
Нестатический член принадлежит экземпляру. Это бессмысленно, так и не разрешив, о каком экземпляре класса вы говорите. В статическом контексте экземпляр отсутствует, поэтому доступ к нестатическому члену невозможен без явного упоминания ссылки на объект.
Фактически, вы можете получить доступ к нестатическому члену в статическом контексте, указав ссылку на объект явно:
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?
Статические функции могут использовать только статические членов и вызывать статические функции.
Как уже упоминалось, статическая функция может работать над экземпляром класса, но не от в экземпляре класса (из-за отсутствия более описательного слова). Например:
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 или более экземпляров класса он должен попытаться получить данные.
Статические функции могут использовать только статические члены и вызывать статические функции.
Как уже упоминалось, статическая функция может работать на экземпляре класса, но не из внутри экземпляра класса (за неимением более описательного слова). 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)
}
}