Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Вот почему this не имеет никакого значения.

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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.

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

Ответ 11

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

MyStaticClass.foo();

и просто

foo();

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

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

Ответ 12

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

Ключевое слово '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);
    }
}

Ответ 13

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

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