Возможно ли создать функцию внутри другой функции в С#? Если да, как это можно сделать?
Как создать функцию внутри другой функции в С#, возможно ли это?
Ответ 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)
}
Ответ 2
Вы можете сделать это в С# 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
Ответ 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();
}