代码之家  ›  专栏  ›  技术社区  ›  Marc

为什么我们不能有内部方法/局部函数?

  •  7
  • Marc  · 技术社区  · 17 年前

    经常发生的情况是,我有一些私有方法,它们变得非常大,并且包含重复的任务,但是这些任务非常具体,所以让它们对任何其他代码部分都可用是没有意义的。

    因此,在这种情况下,能够创建“内部方法”将是非常棒的。

    有没有任何技术(甚至哲学)上的限制阻止C#给出这一点?还是我错过了什么?

    7 回复  |  直到 9 年前
        1
  •  14
  •   Mehrdad Afshari    17 年前

    我们可以在函数中定义“匿名方法”(我不建议使用它们来组织大型方法):

    void test() {
       Action t = () => Console.WriteLine("hello world");  // C# 3.0+
       // Action t = delegate { Console.WriteLine("hello world"); }; // C# 2.0+
       t();
    }
    
        2
  •  7
  •   Grzenio    17 年前

    如果某个对象比通常情况下更长、更复杂,那么最好将其重构为单独的类(正常或静态,取决于上下文),您可以使用专用于此功能的私有方法。

        3
  •  2
  •   CodeSpeaker    17 年前

    我知道很多人不喜欢区域,但在这种情况下,他们可以通过将您的特定方法分组到一个区域来证明其有用。

        4
  •  2
  •   Achim    17 年前

    你能举个更具体的例子吗?读了你的帖子后,我有以下印象,当然这只是猜测,因为信息有限:

    • 私有方法在类之外不可用,因此它们对任何其他代码都是隐藏的。

    阿希姆

        5
  •  1
  •   Jesper Fyhr Knudsen    17 年前

        6
  •  0
  •   Pavel Podlipensky    17 年前

    更好的解决方案是重构此方法以分离类。在初始类中将该类的实例创建为私有字段。将big方法公开,并将big方法重构为几个私有方法,这样就可以清楚地了解它的作用。

        7
  •  0
  •   Marc    9 年前

    看来我们会得到我想要的东西 局部函数 C#7/Visual Studio 15 :
    https://github.com/dotnet/roslyn/issues/2930

    private int SomeMethodExposedToObjectMembers(int input)
    {
        int InnerMethod(bool b)
        {
            // TODO: Change return based on parameter b
            return 0;
        }
    
        var calculation = 0;
        // TODO: Some calculations based on input, store result in calculation
    
        if (calculation > 0) return InnerMethod(true);
        return InnerMethod(false);
    }
    

    真可惜,我为此等了7年多:-)

    有关C#的早期版本,请参见其他答案。