Почему нельзя использовать ключевое слово this
в статическом методе? Мне интересно, почему C # определяет это ограничение. Какие преимущества можно получить с помощью этого ограничения?
[Обновление]: На самом деле, это вопрос, который я получил в интервью. Я знаю, как используются слова static и this, судя по всем вашим ответам, думаю, я немного знаю, почему их нельзя использовать вместе. То есть статический метод используется для изменения состояния или выполнения чего-либо на уровне типа, но когда вам нужно использовать this, значит, вы хотите изменить состояние или сделать что-то на уровне экземпляра. Чтобы различать изменение состояния типа и изменение состояния экземпляра, C # не позволяет использовать this в статическом методе. Я прав?
Поскольку this
указывает на экземпляр класса, в статическом методе у вас нет экземпляра.
. Вы заметите, что статический член определяется как
Вот почему this
не на что указывать.
Статическими методами вы можете написать:
MyClass.static_method();
, который не имеет ничего общего с каким-либо объектом экземпляр (так что вам не нужно это ключевое слово).
Потому что static_method () работает и не требует экземпляров объекта для своей работы. static_method () не знает, какой экземпляр объекта у вас есть, но может изменить поведение всех экземпляров объекта :
MyClass a = new MyClass();
MyClass b = new MyClass();
MyClass.static_method("PRINTER");
a.display(); //print something
b.display(); //print something
MyClass.static_method("MONITOR");
a.display(); //display something on monitor
b.display(); //display something on monitor
В этом случае static_method () изменяет поведение метода display () во всех экземплярах объекта MyClass.
Я не уверен, помогает ли это вашей проблеме, но я считаю, что эти два фрагмента кода эквивалентны:
MyStaticClass.foo();
и просто
foo();
оба вызовут метод foo () в классе MyStaticClass, предполагая, что вы вызываете foo () изнутри MyStaticClass
Правка. Самый простой способ запомнить разницу между статическим и нестатическим классом - это подумать о чем-то вроде класса Math в java. Вы можете вызвать Math.abs (x); чтобы получить абсолютное значение x, и на самом деле не имеет смысла создавать экземпляр объекта Math, поэтому Math является статическим классом.
this
относится к текущему экземпляру класса и поэтому может использоваться только в методах экземпляра. Статические методы действуют на уровне класса, где нет экземпляров. Следовательно, нет этого
.
this
- это экземпляр текущего объекта. В статическом методе нет текущего объекта, и поэтому this
не существует. Это не совсем ограничение, но весь смысл того, что метод является статическим.
this
относится к текущему экземпляру объекта. Статический метод - это метод класса. Это не метод экземпляра, поэтому его использование внутри статического метода бессмысленно.
Я уверен, что это не ограничивается C# и это не ограничение, это логичная ситуация. Как правильно говорит @Yuriy, это относится к текущему экземпляру класса, т.е. вы использовали new (или DI) для инстанцирования класса (создания экземпляра) и вам нужен какой-то способ внутри класса ссылаться на этот экземпляр, т.е. на этот объект. Статический метод вызывается без инстанцирования класса, фактически объект не создается, и как таковой вы не можете получить доступ к свойствам, одним из которых является this.
«this» относится к экземпляру класса. Статический инициализируется без создания экземпляра, поэтому статический метод не может ссылаться на «экземпляр», который не был создан.
Другой, более буквальный ответ на ваш вопрос:
Ключевое слово this нельзя использовать в статическом методе, чтобы избежать путаницы с его использованием в методах экземпляра, где это символ для доступа к указателю (ссылка ) экземпляру, который автоматически передается методу как скрытый параметр.
Если бы не это, вы могли бы определить локальную переменную с именем 'this' в своем статическом методе, но это не было бы связано с экземпляром, на который ссылается ключевое слово this в методах экземпляра.
Ниже приведен пример с двумя эквивалентными методами, один статическим, а другой - методом экземпляра. Оба вызова метода передают один параметр методам, выполняющим код, который будет делать то же самое (печатать строковое представление объекта на консоли) и возвращать.
public class Someclass {
void SomeInstanceMethod()
{ System.Console.WriteLine(this.ToString()); }
void static SomeStaticMethod(Someclass _this)
{ System.Console.WriteLine(_this.ToString()); }
public void static Main()
{
Someclass instance = new Someclass();
instance.SomeInstanceMethod();
SomeStaticMethod(instance);
}
}
Ключевое слово this
относится к экземпляру объекта. В статическом контексте нет конкретного экземпляра для ссылки.
this
используется для ссылки на родительский объект переменной или метода. Когда вы объявляете static
в методе, метод может быть вызван без необходимости создавать экземпляр объекта класса. Поэтому ключевое слово this
запрещено, потому что ваш статический метод не связан ни с какими объектами.
Короткий ответ для вас будет: это относится к экземпляру класса, который не существует. в статической области.
Но, пожалуйста, поищите хорошую книгу / класс и попытайтесь понять основные концепции объектно-ориентированного программирования, прежде чем переходить к любому объектно-ориентированному языку программирования.