Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Как отличить переменную от метода в С#?

#c_sharp #переменные #методы


Изучаю основы. Вычисление объема сферы, фрагмент кода.

public double sqrSphere()
{
    return 4 * Math.PI * r * r;
}

public void writeResult()
{
    Console.WriteLine("Вычислить площадь или объем? s/v:");
    s = Console.ReadLine();
    s = s.ToLower();
    if (s == "s")
    {
        Console.WriteLine("Площадь шара равна {0:#.###}", sqrSphere());
        return;
    }
}


Вопросы:

public double sqrSphere() 


sqrSphere() это метод или переменная? Если метод, то как можно сделать такой вывод?
По наличию параметров после идентефикатора? Раньше знал о переменных double, а здесь
это часть метода?

Console.WriteLine("Площадь шара равна {0:#.###}", sqrSphere());


Здесь выводится значение sqrSphere() . Получается, sqrSphere() - переменная?
Совсем запутался, простите нуба.

P.S.  Всем спасибо за ответы. Есть недостаток знаний о возвращаемых типах и методах
в целом, постигаю азы.
    


Ответы

Ответ 1



Любой метод имеет сигнатуру (собственное имя + список формальных параметров), тип возвращаемого значения, а так же возможно и различные модификаторы. public double sqrSphere() - открытый метод без параметров, возвращающий значение типа double. В этой строке Console.WriteLine("Площадь шара равна {0:#.###}", sqrSphere()); сначала вычисляется результат выполнения метода, а потом этот результат подставляется в форматную строку. За ходом исполнения программы вы можете наблюдать в отладчике.

Ответ 2



небольшое дополнение к уже имеющимся правильным ответам. Действительно иногда бывает трудно только по внешнему виду отличить переменную от свойства, метода или даже типа. Особенно если код чужой, мудреный и открыт в блокноте без подсветки синтаксиса. Поэтому соглашения об именовании становятся еще более актуальными. Понятно что почти у каждой команды есть свои соглашения (camelCase, PascalCase, венгерская нотация и т.д. останется за кадром, религиозные вопросы не трогаю принципиально =)), но некоторые из них можно считать общепринятыми. Ниже примерный список таких соглашений для пользовательских идентификаторов: длина имени должна быть необходимой и достаточной для однозначного понимания его смысла. Иначе говоря, не экономьте символы в ущерб понятности названия, но и не растекайтесь мыслью. Если есть общепринятая (или принятая в вашей команде) аббревиатура (usb, wcf и т.д.), ее можно и нужно использовать, но изобретать что-то свое только для уменьшения длины имени не стоит без крайней необходимости. имя поля или свойства является существительным простым Length, Size либо составным (да простят меня лингвисты за излишнее упрощение) CurrentTime, CustomerList. Для логических полей и свойств допустимо использовать вопросительную форму (IsActive, HasValue). имя метода является глаголом Count(), Sort() или начинается с глагола GetValue(), PerformAction(). Даже этих простых правил именования, не вдаваясь в прочие аспекты Code Conventions, будет вполне достаточно, чтобы относительно комфортно читать код не разыскивая объявление сущности для опознания каждого нового идентификатора.

Ответ 3



Как выглядит разница: //Метод public double Var1() { return 0; } //Свойство public double Var2 { get { return _var3; } set { _var3 = value; } } //Переменная / поле public double _var3 = 0; Раньше знал о переменных double, а здесь это часть метода? В данном случае это не часть метода, а тип возвращаемого значения этим методом. А иногда бывает так: public double sqrSphere() { return 4 * Math.PI * r * r; } public void Print (string str, Func func) { Console.WriteLine(str, func()); } public void writeResult() { Console.WriteLine("Вычислить площадь или объем? s/v:"); s = Console.ReadLine(); s = s.ToLower(); if (s == "s") { Print("Площадь шара равна {0:#.###}", sqrSphere); return; } } Немного глупый пример на коленке, но тут можно увидеть что метод sqrSphere в метод Print передается по виду совсем как переменная/поле/метод и для того, что бы выяснить что перед нами нужно знать сигнатуру метода Print и все станет ясно.

Ответ 4



Ну и совсем уж простейшая деталь: метод без "()" не вызвать. Если видишь имя без "()" - значит, это поле. public double sqrSphere() - а если анализировать эту строку, то public - идентификатор доступа, double - тип, возвращаемый методом, sqrSphere - имя метода. Ну и "()" для принимаемых аргументов.

Ответ 5



Может быть будет понятнее то что в IL коде получается при выводе строчки в консоль? IL_0029: ldstr "Площадь шара равна {0:#.###}" IL_002e: call float64 YourNameSpace.YourClass::'sqrSphere'() IL_0033: box [mscorlib]System.Double IL_0038: call void [mscorlib]System.Console::WriteLine(string, object) call говорит о том что это вызов метода. для переменных только загрузка (команды начинающиеся с ld)

Комментариев нет:

Отправить комментарий