Изучаю основы. Вычисление объема сферы, фрагмент кода.
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. Всем спасибо за ответы. Есть недостаток знаний о возвращаемых типах и методах в целом, постигаю азы.
Любой метод имеет сигнатуру (собственное имя + список формальных параметров), тип возвращаемого значения, а так же возможно и различные модификаторы.
public double sqrSphere()
- открытый метод без параметров, возвращающий значение типа double.
В этой строке
Console.WriteLine("Площадь шара равна {0:#.###}", sqrSphere());
сначала вычисляется результат выполнения метода, а потом этот результат подставляется в форматную строку. За ходом исполнения программы вы можете наблюдать в отладчике.
небольшое дополнение к уже имеющимся правильным ответам.
Действительно иногда бывает трудно только по внешнему виду отличить переменную от свойства, метода или даже типа. Особенно если код чужой, мудреный и открыт в блокноте без подсветки синтаксиса. Поэтому соглашения об именовании становятся еще более актуальными. Понятно что почти у каждой команды есть свои соглашения (camelCase, PascalCase, венгерская нотация и т.д. останется за кадром, религиозные вопросы не трогаю принципиально =)), но некоторые из них можно считать общепринятыми. Ниже примерный список таких соглашений для пользовательских идентификаторов:
длина имени должна быть необходимой и достаточной для однозначного понимания его смысла. Иначе говоря, не экономьте символы в ущерб понятности названия, но и не растекайтесь мыслью. Если есть общепринятая (или принятая в вашей команде) аббревиатура (usb, wcf и т.д.), ее можно и нужно использовать, но изобретать что-то свое только для уменьшения длины имени не стоит без крайней необходимости.
имя поля или свойства является существительным простым Length
, Size
либо составным (да простят меня лингвисты за излишнее упрощение) CurrentTime
, CustomerList
.
Для логических полей и свойств допустимо использовать вопросительную форму (IsActive, HasValue).
имя метода является глаголом Count()
, Sort()
или начинается с глагола GetValue()
, PerformAction()
.
Даже этих простых правил именования, не вдаваясь в прочие аспекты Code Conventions, будет вполне достаточно, чтобы относительно комфортно читать код не разыскивая объявление сущности для опознания каждого нового идентификатора.
Как выглядит разница:
//Метод
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<double> 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
и все станет ясно.
Ну и совсем уж простейшая деталь: метод без "()" не вызвать. Если видишь имя без "()" - значит, это поле.
public double sqrSphere()
- а если анализировать эту строку, то public
- идентификатор доступа, double
- тип, возвращаемый методом, sqrSphere
- имя метода. Ну и "()" для принимаемых аргументов.
Может быть будет понятнее то что в 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)
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Добрый день всемПоявилась проблема: сделал кнопки на двух сценах, чтобы можно было переходить между ними
Имеется некоторое выражение (Например: 50,41+30,42 либо просто 50,41), то есть 2 числа (могут быть дробные/целые, положительные/отрицательные) и знак...