Вызывающий метод Versus class.method
У меня есть класс с двумя методами, определенными в нем.
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();
}
6 ответов
Хотя я согласен с существующими ответами, что это в первую очередь проблема стиля, достаточно проблемы стиля, когда критики кода как Eclipse, так и IntelliJ будут отмечать "нестатические ссылки на статические методы" в коде, который не использует Classname.method()
стиль.
Я сделал привычкой подчеркивать намерения, используя имя класса для определения ссылок на статические цели, this
квалифицировать ссылки на цели экземпляров и голые имена для локальных ссылок. Современная IDE будет использовать различную подсветку для этих конструкций, поэтому я полагаю, что в наши дни она менее важна. Мне нравится, чтобы сопровождающий (часто я сам) знал, что предназначалось, что да, я знал, что это было static
ссылка.
Да, это делает немного более подробный код, но я думаю, что это стоит дополнительных символов.
Я бы пошел с первым методом. На мой взгляд, это эквивалентно:
public void method2()
{
method1();
}
а также:
public void method2()
{
this.method1();
}
Я не знаю многих людей, которые явно вызывают это при вызове другого метода в классе. Так что лично мой вкус - вариант 1 - нет необходимости явно вызывать ClassName.
Ну, это квалифицируется как вопрос, но, очевидно, результаты будут одинаковыми в любом случае, так что это просто вопрос стиля. (Возможно, существуют странные ситуации с перегрузкой, когда это может иметь значение, но вам следует избегать их с самого начала. Я могу привести примеры, если вы хотите, но, вероятно, это того не стоит.)
Если вы чувствуете особую необходимость подчеркнуть, что это статический метод, не стесняйтесь сделать это 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 - по крайней мере, версию, которую я использую.)
С параметром вы можете попасть в нечетные ситуации с параметрами общего типа и выводом типа, но не без каких-либо параметров. Несмотря на это, неуниверсальная форма будет иметь приоритет.
Короче говоря, я не думаю, что смогу сделать это в конце концов:(
Это чисто вопрос стиля, поэтому зависит от вашего вкуса.
Я предпочитаю первую версию. Поскольку 2 метода находятся в одном классе, я не считаю полезным повторять имя класса.
Я делаю
public static method2() {
Routines.method1();
}
Гадать не надо. Это очень ясно, если я вызываю статический метод из родительского класса. Мне не нравится статический импорт по той же причине.
Это только вопрос личной пользы и читабельности кода, но вызов только "method1()" не эквивалентен "this.method", потому что оба метода в примере являются статическими, и вы не можете вызвать объект, для которого не был создан экземпляр, С помощью статических методов вы не можете предвидеть, если существует экземпляр объекта в момент вызова метода, поэтому вы не можете использовать "this". "this" является только указателем на исполняемый объект, если он создан.
Чтобы ответить на вопрос:
Это полный синтаксический сахар - просто написать "method1()" вместо "Routines.method1()". Результат того, что компьютер выполняет / вызывает, то есть то, что компилятор сделал из кода, полностью одинаков.