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

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

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

14
задан airbai 12 August 2010 в 01:04
поделиться

12 ответов

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

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

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

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

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

60
ответ дан 1 December 2019 в 05:49
поделиться

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

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.

2
ответ дан 1 December 2019 в 05:49
поделиться

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

MyStaticClass.foo();

и просто

foo();

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

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

0
ответ дан 1 December 2019 в 05:49
поделиться

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

2
ответ дан 1 December 2019 в 05:49
поделиться

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

13
ответ дан 1 December 2019 в 05:49
поделиться

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

2
ответ дан 1 December 2019 в 05:49
поделиться

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

2
ответ дан 1 December 2019 в 05:49
поделиться

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

0
ответ дан 1 December 2019 в 05:49
поделиться

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

Ключевое слово 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);
    }
}
0
ответ дан 1 December 2019 в 05:49
поделиться

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

1
ответ дан 1 December 2019 в 05:49
поделиться

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

0
ответ дан 1 December 2019 в 05:49
поделиться

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

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

0
ответ дан 1 December 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: