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

241
16 марта 2017, 19:43

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

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. Всем спасибо за ответы. Есть недостаток знаний о возвращаемых типах и методах в целом, постигаю азы.

Answer 1

Любой метод имеет сигнатуру (собственное имя + список формальных параметров), тип возвращаемого значения, а так же возможно и различные модификаторы.

public double sqrSphere() - открытый метод без параметров, возвращающий значение типа double.

В этой строке

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

сначала вычисляется результат выполнения метода, а потом этот результат подставляется в форматную строку. За ходом исполнения программы вы можете наблюдать в отладчике.

Answer 2

небольшое дополнение к уже имеющимся правильным ответам.

Действительно иногда бывает трудно только по внешнему виду отличить переменную от свойства, метода или даже типа. Особенно если код чужой, мудреный и открыт в блокноте без подсветки синтаксиса. Поэтому соглашения об именовании становятся еще более актуальными. Понятно что почти у каждой команды есть свои соглашения (camelCase, PascalCase, венгерская нотация и т.д. останется за кадром, религиозные вопросы не трогаю принципиально =)), но некоторые из них можно считать общепринятыми. Ниже примерный список таких соглашений для пользовательских идентификаторов:

  • длина имени должна быть необходимой и достаточной для однозначного понимания его смысла. Иначе говоря, не экономьте символы в ущерб понятности названия, но и не растекайтесь мыслью. Если есть общепринятая (или принятая в вашей команде) аббревиатура (usb, wcf и т.д.), ее можно и нужно использовать, но изобретать что-то свое только для уменьшения длины имени не стоит без крайней необходимости.

  • имя поля или свойства является существительным простым Length, Size либо составным (да простят меня лингвисты за излишнее упрощение) CurrentTime, CustomerList.

  • Для логических полей и свойств допустимо использовать вопросительную форму (IsActive, HasValue).

  • имя метода является глаголом Count(), Sort() или начинается с глагола GetValue(), PerformAction().

Даже этих простых правил именования, не вдаваясь в прочие аспекты Code Conventions, будет вполне достаточно, чтобы относительно комфортно читать код не разыскивая объявление сущности для опознания каждого нового идентификатора.

Answer 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<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 и все станет ясно.

Answer 4

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

Answer 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)

READ ALSO
не работает SceneManager.LoadScene

не работает SceneManager.LoadScene

Добрый день всемПоявилась проблема: сделал кнопки на двух сценах, чтобы можно было переходить между ними

482
Как правильно работать с regular expressions Groups с#

Как правильно работать с regular expressions Groups с#

Имеется некоторое выражение (Например: 50,41+30,42 либо просто 50,41), то есть 2 числа (могут быть дробные/целые, положительные/отрицательные) и знак...

276
сохранить данные в тхт не построчно

сохранить данные в тхт не построчно

Есть такой код, который сохраняет текст в тхт построчно

253