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

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

[обновление]: Вообще-то, этот вопрос я получил в интервью. Я знаю использование "static" и "this", основываясь на всем вашем ответе, я думаю, я знаю немного, почему они не могут использоваться вместе. То есть для статического метода используется измененное состояние или что-то делать на уровне типа, но когда нужно использовать "это" означает, что вы хотите изменить состояние или сделать что-то на уровне экземпляра. Чтобы дифференцировать изменение состояния типа и изменение состояния экземпляра, то c# donot позволяет использовать " это " в статическом методе. Я прав?

13 ответов


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

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

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

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

именно поэтому this ничего не указывают.


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


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


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


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


ключевое слово 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.


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


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


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

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


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

MyStaticClass.foo();

и просто

foo();

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

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


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

ключевое слово "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 ключевое слово can используется в методе, помеченном как static. Синтаксис используется для определения методы расширения в C#. Эта функция была доступна с C# 3.0, выпущенного в 2007 году (Википедия)

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