У меня есть класс с двумя определенными в нем методами.
public class Routines {
public static method1() {
/* set of statements */
}
public static method2() {
/* another set of statements.*/
}
}
Теперь мне нужно вызвать method1 () из method2 ()
Какой из следующих подходов лучше? Или это квалифицируется как вопрос?
public static method2() {
method1();
}
ИЛИ ЖЕ
public static method2() {
Routines.method1();
}




Что ж, это квалифицируется как вопрос, но очевидно, что результаты в любом случае будут такими же, так что это просто вопрос стиля. (Вероятно, существуют странные ситуации перегрузки, когда мог имеет значение, но вам следует избегать их для начала. Я могу привести примеры, если хотите, но, вероятно, это того не стоит.)
Если вы чувствуете особую потребность подчеркнуть, что это статический метод, не стесняйтесь сделать его Routines.method1() - но обычно я бы просто оставил его как method1().
Обновлено: Я попытался привести пример, в котором есть разница при использовании перегрузки с помощью params:
void CallMethod()
{
Console.WriteLine("Calling Method()");
Method();
Console.WriteLine("Calling Test.Method()");
Test.Method();
}
void Method(params string[] ignored)
{
Console.WriteLine (" Instance method called");
}
static void Method()
{
Console.WriteLine (" Static method called");
}
Однако в обоих случаях это вызывает статический метод. (Интересно, что размещение params в статическом методе дает немного сбивающее с толку сообщение об ошибке при использовании компилятора MS C# и полностью взрывает компилятор Mono - по крайней мере, версию, которую я использую.)
С параметром вы можете попасть в странные ситуации с параметрами универсального типа и выводом типа, но не без каких-либо параметров. Даже в этом случае приоритет будет иметь неуниверсальная форма.
Короче, не думаю, что все-таки смогу :(
Я не упоминал о переопределении. Я упомянул перегрузку.
Джон: Я бы хотел увидеть пример :)
В Java (не уверен в C#) перегруженные статические методы становятся сложными только тогда, когда вы расширяете родительский класс и создаете новые методы с соответствующими подписями. Вызов полностью квалифицированного метода позволяет полностью избежать проблемы.
@basszero: Сложность в моем пытаться заключалась в том, что у этих двух методов разные сигнатуры, но они оба совпадают. Впрочем, это уже в спецификации, судя по всему, однозначно.
Это чисто стилистический вопрос, поэтому все зависит от вашего вкуса.
Я предпочитаю первую версию. Поскольку 2 метода находятся в одном классе, я не считаю полезным повторять имя класса.
Я бы выбрал первый метод. На мой взгляд, это эквивалент:
public void method2()
{
method1();
}
и:
public void method2()
{
this.method1();
}
Я не знаю многих людей, которые явно вызывают это при вызове другого метода в классе. Так что лично мне нравится вариант 1 - не нужно явно вызывать ClassName.
Только не используйте this.method1 (), если оба метода статические. Пока он работает, вы получите предупреждение компилятора.
@Р. Бемроуз - не пойдет, получите компилятор ошибка. Вы не можете вызвать статический метод с это.
Вы не можете использовать this из статического метода - это ошибка. Вы можете использовать this.staticMethod () из нестатического метода. По умолчанию при этом будет выдано предупреждение - некоторые компиляторы могут быть настроены так, чтобы рассматривать это как ошибку.
Хотя я согласен с существующими ответами, что это в первую очередь проблема стиля, достаточно проблемы стиля, чтобы критики кода Eclipse и IntelliJ отметили «нестатические ссылки на статические методы» в коде, который не использует стиль Classname.method().
Я взял за привычку выделять намерение, используя имя класса для уточнения ссылок на статические цели, this для уточнения ссылок на цели экземпляра и голые имена для локальных ссылок. В современной среде IDE для этих конструкций будет использоваться другое выделение, поэтому я полагаю, что в наши дни это менее важно. Мне нравится, что сопровождающий (часто я) использую знать для того, что было задумано, да, я знал, что это ссылка на static.
Да, это делает код более подробным, но я думаю, что лишние символы стоят того.
это не предупреждение при использовании статического члена в нестатическом контексте? здесь method2 () - это статический контекст ... поэтому я думаю, что предупреждения не будет ...
@Vinze: Я тоже видел это сообщение. Скорее всего, вы правы, что в данном конкретном случае это сообщение не будет отображаться. Однако, поскольку вопрос касался стиля и почему, я немного обобщил (и, возможно, недостаточно внимательно прочитал пример ;-))
полностью согласен, и я использую «это». а также - ясность - это все
Это (каламбур :)) - дело стиля и уже подробно обсуждалось по многим вопросам ...
Вы также используете имя класса при обращении к константе? то есть Classname.MY_PUBLIC_FINAL_VALUE и Classname.MY_PRIVATE_FINAL_VALUE изнутри Classname?
Да, очень часто в «публичном» деле. В частном случае не всегда, потому что соглашение об именах (ALL_UPPER) передает намерение. Введение статического импорта в Java заставило меня пересмотреть эту практику для общедоступных констант / методов, но до сих пор я все еще следую тому, что я описал.
я делаю
public static method2() {
Routines.method1();
}
Без предположений. Совершенно ясно, если я вызываю статический метод из родительского класса. Мне не нравится статический импорт по той же причине.
Соглашаться. Я даже не думаю, что это вопрос стиля. Правильнее всего сделать ваш код ясным, и это продемонстрирует, что это статический метод.
Готов поспорить, у нас будет меньше ошибок во всех программах, если компилятор Java / C# заставит нас добавить «это». / "Класс." для всех учеников; все остальное местное.
Это всего лишь вопрос личного предпочтения и удобочитаемости кода, но вызов просто «method1 ()» не эквивалентен «this.method», потому что оба метода в примере являются статическими, и вы не можете вызвать объект, экземпляр которого не был создан. . С помощью статических методов вы не можете предвидеть, существует ли экземпляр объекта в момент вызова метода, поэтому вы не можете использовать "this". "this" - это только указатель на исполняемый объект, если он создан.
Чтобы ответить на вопрос:
Просто написать «method1 ()» вместо «Routines.method1 ()» - это полный синтаксический сахар. Результат того, что компьютер выполняет / вызывает, что компилятор сделал из кода, полностью одинаков.
статические методы нельзя переопределить, поэтому я думаю, что это чисто вопрос стиля