Почему ключевое слово "this" нельзя использовать в статическом методе?
почему ключевое слово this
использоваться в статическом методе? Мне интересно, почему C# определяет это ограничение. Какие выгоды может принести это ограничение?
[обновление]: Вообще-то, этот вопрос я получил в интервью. Я знаю использование "static" и "this", основываясь на всем вашем ответе, я думаю, я знаю немного, почему они не могут использоваться вместе. То есть для статического метода используется измененное состояние или что-то делать на уровне типа, но когда нужно использовать "это" означает, что вы хотите изменить состояние или сделать что-то на уровне экземпляра. Чтобы дифференцировать изменение состояния типа и изменение состояния экземпляра, то c# donot позволяет использовать " это " в статическом методе. Я прав?
13 ответов
, потому что this
указывает на экземпляр класса, в статическом методе у вас нет экземпляра.
вы заметите, что определение статического члена
именно поэтому 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
есть, концептуально.