C#:为什么我们不能有内部方法/本地函数?

时间:2009-07-31 09:08:25

标签: c# .net

我经常遇到私有方法,这些方法变得非常大并且包含重复的任务,但这些任务非常具体,因此将它们提供给任何其他代码部分是没有意义的。

因此,在这种情况下能够创建'内部方法'真的很棒。

是否有任何技术(甚至是哲学?)限制阻止C#给我们这个?或者我错过了什么?

2016年更新:即将到来,它被称为“本地功能”。见标记答案。

7 个答案:

答案 0 :(得分:14)

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

void test() {
   Action t = () => Console.WriteLine("hello world");  // C# 3.0+
   // Action t = delegate { Console.WriteLine("hello world"); }; // C# 2.0+
   t();
}

答案 1 :(得分:7)

如果某些东西很长很复杂,通常是将它重构为一个单独的类(正常或静态 - 取决于上下文)的好习惯 - 那么你可以使用专用于此功能的私有方法。

答案 2 :(得分:2)

我知道很多人不喜欢地区,但是通过将您的具体方法分组到某个地区,这可能会证明是有用的。

答案 3 :(得分:2)

你能举一个更具体的例子吗?阅读完帖子后,由于信息有限,我有以下印象,当然只是猜测:

  • 私有方法在您的课程之外不可用,因此无论如何它们都不会被任何其他代码隐藏。
  • 如果您想隐藏同一班级中其他代码的私有方法,那么您的班级可能会很大,可能会违反单一责任规则。
  • 看看匿名委托一个lambda表达式。这不完全是你要求的,但它们可以解决你的大多数问题。

Achim的

答案 4 :(得分:1)

如果您的方法变得太大,请考虑将其放在单独的类中,或者创建私有帮助器方法。通常我会在通常写评论的时候创建一个新方法。

答案 5 :(得分:0)

更好的解决方案是重构此方法以分离类。在初始类中将此类的实例创建为私有字段。将大方法公之于众,并将大方法重构为几种私有方法,因此它的作用会很清楚。

答案 6 :(得分:0)

似乎我们将在 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#早期版本的其他答案。