Почему ключевое слово this нельзя использовать в статическом методе?

Почему нельзя использовать ключевое слово this в статическом методе? Мне интересно, почему С# определяет это ограничение. Какие преимущества можно получить с помощью этого ограничения?

[Обновление]: На самом деле, это вопрос, который я получил в интервью. Я знаю использование «статического» и «этого», основываясь на всех ваших ответах, я думаю, я немного знаю, почему их нельзя использовать вместе. То есть статический метод используется для изменения состояния или выполнения каких-либо действий на уровне типа, но когда вам нужно использовать «это», это означает, что вы хотите изменить состояние или сделать что-либо на уровне экземпляра. Чтобы различать изменение состояния типа и изменение состояния экземпляра, С# не позволяет использовать this в статическом методе. Я прав?


person airbai    schedule 11.08.2010    source источник
comment
Статические классы и члены статических классов (Руководство по программированию на C#): msdn.microsoft.com/ en-us/library/79b3xss3.aspx   -  person Hans Olsson    schedule 11.08.2010
comment
Можете ли вы рассказать нам, что вы хотите сделать, и почему вы думаете, что это будет связано с комбинацией static и this? Обычно, если вам нужно смешать их, вы вызываете статический метод из нестатического метода (или ссылаетесь на поле, устанавливаете свойство и т. д.).   -  person We Are All Monica    schedule 11.08.2010
comment
Я всегда хотел иметь ключевое слово в статических методах, которое говорит о текущем классе. Это может избежать множества ошибок и ошибок копирования и вставки, если вам нужен тип текущего класса. Но я бы назвал это не так, а классом :)   -  person codymanix    schedule 11.08.2010
comment
Я не могу не задаться вопросом, был ли этот вопрос не чем иным, как новым пользователем, пытающимся получить свою репутацию, чтобы они действительно могли выполнять действия, ограниченные повторами, на этом сайте. Не думаю, что я могу много говорить, потому что я сделал то же самое! :D   -  person Jagd    schedule 11.08.2010
comment
Важно отметить, что это не ограничение, а часть определения того, что такое статический метод/свойство: что-то общее для всех экземпляров, поэтому оно не может иметь ссылку на какой-либо конкретный экземпляр. Кроме того, как кто-то указал в другом комментарии, это не относится к С#: Java, и почти все объектно-ориентированные языки имеют эту концепцию.   -  person Monoman    schedule 11.08.2010
comment
Я даю вам -1 за то, что вы задали этот вопрос здесь. Это то, что вы должны рассмотреть в базовом руководстве по программированию. Я согласен с Jagd здесь.   -  person codemonkeh    schedule 12.08.2010
comment
Извините - какая-то демоническая сила заставила меня проголосовать против этого. Меня действительно раздражает, что некоторые люди понятия не имеют, что такое метод класса, и явно не пытались его исследовать, а вместо этого предполагают, что Static означает то же самое, что и в VB6. Я переживу это, хотя...   -  person CompanyDroneFromSector7G    schedule 08.10.2014


Ответы (13)


Поскольку this указывает на экземпляр класса, в статическом методе у вас нет экземпляра.

Ключевое слово this относится к текущему экземпляр класса. Статические функции-члены не имеют указателя this.

Вы заметите, что определение статического члена

Используйте модификатор static, чтобы объявить статический член, принадлежащий самому типу, а не конкретному объекту

Вот почему this не на что указать.

person Yuriy Faktorovich    schedule 11.08.2010
comment
Пожалуйста, объясните, почему в статическом методе нет экземпляра :) - person Blixt; 11.08.2010
comment
Подумайте о том, как вы вызываете статические методы. Class.Method() как Animal.Eat() Вам никогда не нужен был экземпляр (новый Animal()) для вызова статического метода. Вот почему его нет. - person Blub; 11.08.2010
comment
Я не могу представить статичное животное, не говоря уже о том, что оно ест. - person jessegavin; 11.08.2010

this — это экземпляр текущего объекта. Со статическим методом нет текущего объекта, и поэтому this не существует. На самом деле это не ограничение, а суть метода в том, что он статический.

person Shawn D.    schedule 11.08.2010

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

person Anton Gogolev    schedule 11.08.2010

this относится к текущему экземпляру объекта. Статический метод — это метод класса. Это не метод экземпляра, поэтому использовать его внутри статического метода бессмысленно.

person madcapnmckay    schedule 11.08.2010

Я почти уверен, что это не ограничивается С#, и это не ограничение, это логическая ситуация. Как правильно указывает @Yuriy, это относится к текущему экземпляру класса, т.е. вы использовали новый (или DI) для создания экземпляра класса (создали экземпляр), и вам нужно каким-то образом внутренне ссылаться на этот экземпляр, т.е. объект. Статический метод вызывается без создания экземпляра класса, фактически объект не создается, и поэтому вы не можете получить доступ к свойствам, одним из которых является этот.

person Lazarus    schedule 11.08.2010
comment
Поскольку «это не ограничивается С#, и это не ограничение, это логическая ситуация», я согласен :) - person airbai; 12.08.2010

Статическими методами вы можете написать:

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.

person Sadeq    schedule 11.08.2010
comment
Я думаю, вы смешиваете здесь C++ и C#. - person strager; 11.08.2010

Ключевое слово this относится к экземпляру объекта. В статическом контексте нет конкретного экземпляра для ссылки.

person Jerod Houghtelling    schedule 11.08.2010

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

person Covar    schedule 11.08.2010

'this' относится к экземпляру класса. Статический метод инициализируется без создания экземпляра, поэтому статический метод не может ссылаться на «экземпляр», который не создан.

person happyfeet    schedule 11.08.2010

Краткий ответ для вас будет таким: это относится к экземпляру класса, который не существует в статической области.

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

person Miguel    schedule 11.08.2010

Я не уверен, поможет ли это вашей проблеме, но я считаю, что эти два фрагмента кода эквивалентны:

MyStaticClass.foo();

и просто

foo();

оба будут вызывать метод foo() в классе MyStaticClass, предполагая, что вы вызываете foo() изнутри MyStaticClass

Изменить. Самый простой способ запомнить разницу между статическим классом и нестатическим классом — подумать о чем-то вроде класса Math в java. Вы можете вызвать Math.abs(x); чтобы получить абсолютное значение x, и на самом деле не имеет смысла создавать экземпляр объекта Math, поэтому Math является статическим классом.

person jbabey    schedule 11.08.2010

Другой, более буквальный ответ на ваш вопрос:

Ключевое слово 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);
    }
}
person Monoman    schedule 11.08.2010
comment
Спасибо jleedev за форматирование. Пока не знает, как это сделать. :) - person Monoman; 11.08.2010

Ключевое слово this может использоваться в методе, отмеченном как static. Синтаксис используется для определения расширения. методы в C#. Эта функция доступна начиная с версии C# 3.0, выпущенной в 2007 году (Википедия).

В обычном использовании this относится к экземпляру, static говорит, что экземпляра нет (и, следовательно, нет this). Тот факт, что вы не можете использовать их вместе (кроме особых исключений, таких как методы расширения), естественно следует из понимания того, что такое this и static, концептуально.

person pjpants3k    schedule 13.10.2017