是否可以在C#中的另一个函数内创建一个函数?如果是这样,怎么办呢?
答案 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();
}
这称为本地功能,这正是您所寻找的。 p>
答案 3 :(得分:-1)
这不是代码味道,X ++以最简单的方式完成它......
public void PublicMethod() {
void LocalMethod() {
//do stuff
}
LocalMethod();
}
答案 4 :(得分:-2)
Eilon的答案在技术上是正确的,因为您可以使用委托在方法中有效地创建方法。我要问的问题是你为什么需要在线创建函数?
这对我来说有点代码味道。是的,内部方法可以重复使用方法的其余部分,但它表明代码中有一个元素,设计尚未经过深思熟虑。如果您需要以这种方式使用委托,您可能会做一些相当小且重复的事情,这些事情可以更好地作为类中的函数,甚至是实用程序类。如果您使用.Net 3.5,那么定义扩展也可能是一个有用的替代方案,具体取决于所委托代码的有用性。
如果您能帮助我们理解为什么您需要以这种方式编写代码,那么更好地回答这个问题会更容易。