如何在c#中的另一个函数内创建函数,是否可能?

时间:2010-01-12 06:44:37

标签: c# methods

是否可以在C#中的另一个函数内创建一个函数?如果是这样,怎么办呢?

5 个答案:

答案 0 :(得分:17)

这当然是可能的。

您可以在其他方法中创建作为函数的委托。这适用于C#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)
}

答案 1 :(得分:11)

你可以在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

答案 2 :(得分:9)

从C#7.0开始,您可以这样做:

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

     Hi();
 }
  

这称为本地功能,这正是您所寻找的。

我从here获取了示例,但可以找到更多信息,herehere

答案 3 :(得分:-1)

这不是代码味道,X ++以最简单的方式完成它......

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

    LocalMethod();
}

请参阅http://msdn.microsoft.com/en-us/library/aa637343.aspx

答案 4 :(得分:-2)

Eilon的答案在技术上是正确的,因为您可以使用委托在方法中有效地创建方法。我要问的问题是你为什么需要在线创建函数?

这对我来说有点代码味道。是的,内部方法可以重复使用方法的其余部分,但它表明代码中有一个元素,设计尚未经过深思熟虑。如果您需要以这种方式使用委托,您可能会做一些相当小且重复的事情,这些事情可以更好地作为类中的函数,甚至是实用程序类。如果您使用.Net 3.5,那么定义扩展也可能是一个有用的替代方案,具体取决于所委托代码的有用性。

如果您能帮助我们理解为什么您需要以这种方式编写代码,那么更好地回答这个问题会更容易。