@Rashad31

Методы и функции в C#?

Всем привет!

Читаю сейчас Шилдта и дошел до методов(6 Глава). В общем возник такой вопрос, а в C# методы и функции чем-то отличаются или нет? Потому-что например в JS(и не только) функции выглядят вот так:
function test() {
    // code...
}

а в C#:
static void test() {
    // code...
}


Может я чего-то не понимаю, но разве синтаксис функций и методов в С# не одинаковый? И что вообще называют методами и функциями? Спасибо за ответы.
  • Вопрос задан
  • 1961 просмотр
Решения вопроса 1
@majstar_Zubr
C++, C#, gamedev
Есть термины функция, процедура, метод в рамках парадигм программирования, но терминология в C# иная.

В C# нет функций и процедур, есть только методы и делегаты.
Лямбда-выражения, в зависимости от контекста, "под капотом" приводятся к анонимным делегатам с телом или к Func, Predicate, Action.
Все утыкается в объектную модель, которую поддерживает абстрактная машина языка C#.
Единицей трансляции является класс, и свободных функций в namespace быть не может, так же как и указателей на функцию в принципе - вместо указателей на функцию в C# используются делегаты. Делегат реализован как абстрактный класс, это позволило реализовать типобезопасные ссылки на методы, которые можно складывать и вычитать, позволило удобно реализовать асинхронность.

Делегат указывает только лишь на сигнатуру метода. Но предполагается, что объект, у которого вызывается метод через делегат, является экземпляром класса, который имеет такую же сигнатуру, как и делегат.

В C# нет понятия функции как объекта, функцию нельзя просто так создать. Вообще можно, но прежде чем её использовать, её нужно будет скомпилировать, но она будет в любом случае в каком-то классе, и она будет методом этого класса; и чтобы методы вызвать, сначала надо получить ссылку на экземпляр класса.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
freeExec
@freeExec
Участник OpenStreetMap
Метод - он что-то делает молча и возвращает ничто (void).
Функция же после того как что-то сделала, возвращает свой результат, будь то число, текст или даже целый класс.
В общем различия только философские.
Ответ написан
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Вот хороший пример. Компилятор за меня ловит когда я в одном классе меняю тип на другой и просто показывает строку, в JS я бы сам это отлавливал
https://github.com/vkorotenko/FiasServer/blob/mast...

public static DbStead Get(this Stead s)
        {
            if (s.Number?.Length > 120)
#pragma warning disable 642
                ; // ловим превышение длины
#pragma warning restore 642
            return new DbStead
            {
                STEADID = s.STEADID,
                IFNSUL = s.IFNSUL.ToNullInt(),
                OKATO = s.OKATO.ToNullLong(),
                RegionCode = s.RegionCode,
                PostalCode = s.PostalCode.ToNullInt(),
                NORMDOC = s.NORMDOC.ToNullGuid(),
                OKTMO = s.OKTMO.ToNullLong(),
                TERRIFNSUL = s.TERRIFNSUL.ToNullInt(),
                IFNSFL = s.IFNSFL.ToNullInt(),
                TERRIFNSFL = s.TERRIFNSFL.ToNullInt(),
                STEADGUID = s.STEADGUID,
                CADNUM = s.CADNUM,
                DIVTYPE = s.DIVTYPE,
                ENDDATE = s.ENDDATE,
                LIVESTATUS = s.LIVESTATUS,
                NEXTID = s.NEXTID.ToNullGuid(),
                Number = s.Number,
                OPERSTATUS = s.OPERSTATUS,
                PARENTGUID = s.PARENTGUID.ToNullGuid(),
                PREVID = s.PREVID.ToNullGuid(),
                STARTDATE = s.STARTDATE,
                UPDATEDATE = s.UPDATEDATE
            };
        }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы