Как создать функцию внутри другой функции в C #, это возможно? - PullRequest
13 голосов
/ 12 января 2010

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

Ответы [ 5 ]

17 голосов
/ 12 января 2010

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

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

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

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

public void OuterMethod() {
    Func<int, string, string> myFunc = (int p1, string p2) => p2.Substring(p1)
}
11 голосов
/ 15 декабря 2015

Вы можете сделать это в C # 7 (нужно VS 2017)

static void Main(string[] args)
{
    int fib0 = 1; //!
    int Fib(int n) => (n < 2) ? fib0 : Fib(n - 1) + Fib(n - 2);

    Console.WriteLine(Fib(7));
    Console.ReadKey();
}

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/local-functions

9 голосов
/ 27 августа 2016

Начиная с C # 7.0, вы можете сделать это:

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

     Hi();
 }

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

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

0 голосов
/ 01 апреля 2014

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

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

    LocalMethod();
}

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

0 голосов
/ 12 января 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...