Почему ключевое слово 'this' нельзя использовать в статическом методе? - PullRequest
13 голосов
/ 11 августа 2010

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

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

Ответы [ 13 ]

60 голосов
/ 11 августа 2010

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

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

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

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

Именно поэтому this не имеет ничего, чтобы указыватьк.

13 голосов
/ 11 августа 2010

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

2 голосов
/ 11 августа 2010

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

2 голосов
/ 11 августа 2010

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

2 голосов
/ 11 августа 2010

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

1 голос
/ 11 августа 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.

1 голос
/ 11 августа 2010

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

0 голосов
/ 13 октября 2017

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

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

0 голосов
/ 11 августа 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);
    }
}
0 голосов
/ 11 августа 2010

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

MyStaticClass.foo();

и просто

foo();

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

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

...