Подтвердить что ты не робот

Как создать функцию внутри другой функции в С#, возможно ли это?

Возможно ли создать функцию внутри другой функции в С#? Если да, как это можно сделать?

4b9b3361

Ответ 1

Это, безусловно, возможно.

Вы можете создавать делегаты, которые являются функциями, внутри других методов. Это работает в С# 2.0:

public void OuterMethod() {
    someControl.SomeEvent += delegate(int p1, string p2) {
        // this code is inside an anonymous delegate
    }
}

И это работает в более новых версиях с lambdas:

public void OuterMethod() {
    Func<int, string, string> myFunc = (int p1, string p2) => p2.Substring(p1)
}

Ответ 3

С С# 7.0 вы можете сделать это:

 public static void SlimShady()
 {
     void Hi([CallerMemberName] string name = null)
     {
         Console.WriteLine($"Hi! My name is {name}");
     }

     Hi();
 }

Это называется локальными функциями, это именно то, что вы искали.

Я привел пример из здесь, но дальнейшая информация может быть найдена здесь и здесь.

Ответ 4

Ответ на Eilon технически корректен, поскольку вы можете использовать делегаты для эффективного создания метода в рамках метода. Вопрос, который я задал бы, - это то, почему вам нужно создать функцию в строке вообще?

Это немного запах кода для меня. Да, внутренний метод повторно используется для остальной части вашего метода, но он предполагает, что есть элемент кода, в котором дизайн не продумано. Скорее всего, если вам нужно использовать делегат таким образом, вы, вероятно, будете делать что-то довольно маленькое и повторяющееся, что лучше будет служить функцией в классе или даже в классе утилиты. Если вы используете .Net 3.5, то определение расширений также может быть полезной альтернативой в зависимости от полезности передаваемого кода.

Было бы легче ответить на этот вопрос лучше, если бы вы могли помочь нам понять, почему вы чувствуете необходимость писать свой код таким образом.

Ответ 5

Это так не запах кода, что X ++ сделал это простейшим способом...

public void PublicMethod() {
    void LocalMethod() {
        //do stuff
    }

    LocalMethod();
}

см. http://msdn.microsoft.com/en-us/library/aa637343.aspx