方法中的方法

时间:2011-11-15 10:41:32

标签: c# methods

我正在创建一个带有一些可重用代码的C#库,并且正在尝试在方法中创建一个方法。我有这样的方法:

public static void Method1()
{
   // Code
}

我想做的是:

public static void Method1()
{
   public static void Method2()
   {
   }
   public static void Method3()
   {
   }
}

然后我可以选择Method1.Method2Method1.Method3。很显然,编译器对此并不满意,非常感谢任何帮助。感谢。

10 个答案:

答案 0 :(得分:95)

如果使用嵌套方法,则表示只能在该方法中调用的方法(如在Delphi中),您可以使用委托。

public static void Method1()
{
   var method2 = new Action(() => { /* action body */ } );
   var method3 = new Action(() => { /* action body */ } );

   //call them like normal methods
   method2();
   method3();

   //if you want an argument
   var actionWithArgument = new Action<int>(i => { Console.WriteLine(i); });
   actionWithArgument(5);

   //if you want to return something
   var function = new Func<int, int>(i => { return i++; });
   int test = function(6);
}

答案 1 :(得分:48)

这个答案是在C#7问世之前写的。使用C#7,可以编写本地方法。

不,你不能这样做。你可以创建一个嵌套类:

public class ContainingClass
{
    public static class NestedClass
    {
        public static void Method2()
        {
        } 

        public static void Method3()
        {
        }
    }
}

然后你打电话:

ContainingClass.NestedClass.Method2();

ContainingClass.NestedClass.Method3();

不会推荐这个。 通常拥有公共嵌套类型是个坏主意。

您能告诉我们您正在努力实现的目标吗?可能有更好的方法。

答案 2 :(得分:42)

是的,当C# 7.0被释放后,Local Functions将允许您这样做。您将能够在方法中使用方法:

public int GetName(int userId)
{
    int GetFamilyName(int id)
    {
        return User.FamilyName;
    }

    string firstName = User.FirstName;
    var fullName = firstName + GetFamilyName(userId);

    return fullName;
}

答案 3 :(得分:25)

您可以使用完整代码在方法中定义委托,并根据需要调用它们。

public class MyMethods
{
   public void Method1()
   {
     // defining your methods 

     Action method1 = new Action( () => 
      { 
         Console.WriteLine("I am method 1");
         Thread.Sleep(100);
         var b = 3.14;
         Console.WriteLine(b);
      }
     ); 

     Action<int> method2 = new Action<int>( a => 
      { 
         Console.WriteLine("I am method 2");
         Console.WriteLine(a);
      }
     ); 

     Func<int, bool> method3 = new Func<int, bool>( a => 
      { 
         Console.WriteLine("I am a function");
         return a > 10;
      }
     ); 


     // calling your methods

     method1.Invoke();
     method2.Invoke(10);
     method3.Invoke(5);

   }
}

在类中使用嵌套类总是可以选择从外部看不到并调用其方法,例如:

public class SuperClass
{
    internal static class HelperClass
    {
      internal static void Method2() {}
    }

    public void Method1 ()
    {
      HelperClass.Method2();
    }

}

答案 4 :(得分:8)

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

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

     Hi();
 }
  

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

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

答案 5 :(得分:3)

为什么不使用课程?

public static class Helper
    {
        public static string MethodA()
        {
            return "A";
        }

        public static string MethodA()
        {
            return "A";
        }
    }

现在您可以通过

访问方法
Helper.MethodA();

答案 6 :(得分:3)

旧线程,但C#确实具有嵌套函数的概念

    Func<int> getCalcFunction(int total, bool useAddition)
    {
        int overallValue = 0;
        if (useAddition)
        {
            Func<int> incrementer = new Func<int>(() =>
            {
                overallValue += total;
                return overallValue;
            });
            return incrementer;
        }
        else
        {
            Func<int> decrementer = new Func<int>(() =>
            {
                overallValue -= total;
                return overallValue;
            });
            return decrementer;
        }
    }
    private void CalcTotals()
    {
        Func<int> decrem = getCalcFunction(30, false);
        int a = decrem(); //result = -30
        a = decrem(); //result = -60

        Func<int> increm = getCalcFunction(30, true);
        int b = increm(); //result = 30
        b = increm(); //result = 60
    }

答案 7 :(得分:2)

你几乎在那里

public static void Method1()

应该是

public static class Method1{}

答案 8 :(得分:1)

您不想使用嵌套类吗?

据说,你似乎不尊重Single Responsibility Principle,因为你想要一个方法一次做多件事。

答案 9 :(得分:-3)

为什么不在另一个

中运行方法

public void M1() { 做东西 }

public void M1() { 做东西 M1(); }