【问题标题】:Local function - assigning variable [closed]局部函数 - 分配变量
【发布时间】:2017-11-30 08:11:14
【问题描述】:

我想知道编写返回值并将其分配给“父”函数中的变量的本地函数的“正确”或“推荐”方式是什么。 (本地函数的“主机”的实际名称是什么?)

我看到了以下 3 种可能性(也许还有更多):

  • 在本地函数中使用一个变量并在最后返回这个

    private void Foo()
    {
        int sum = Sum(1, 2);
    
        int Sum(int a, int b)
        {
            int localSum = a + b;
            return localSum;
            //I know I could write return a + b; but its just a simple demonstration
            //imagine something more complex, where you intialize an object and work with it in the "Sum" method and than want to return it
        }
    }
    
  • 使用“父”函数的变量并设置它并使用 void 函数

    private void Foo()
    {
        int sum;
        Sum(1, 2);
    
        void Sum(int a, int b)
        {
            sum = a + b;
        }
    }
    
  • 结合以上两者,以便更容易阅读 Sum 正在设置 sum 变量,但在本地函数中删除变量声明

    private void Foo()
    {
        int sum = Sum(1, 2);
    
        int Sum(int a, int b)
        {
            sum = a + b;
            return sum;
        }
    }
    

【问题讨论】:

  • 这是非常基于意见的。不过,我绝对不会接受最后一个 - both 会令人困惑。选择一个或另一个 - 返回或变异。
  • 我肯定更喜欢第一个。第二种情况就像使用全局变量来共享状态。如果该功能不再存在 - 如果不深入研究其源代码,您将不知道它实际上有什么效果。

标签: c# c#-7.0


【解决方案1】:

如果我们将您的前两个代码示例放入 SharpLab,我们可以看到编译器将代码降低到:

For code sample 1:

public class C
{
    private void Foo()
    {
        C.<Foo>g__Sum|0_0(1, 2);
    }

    [CompilerGenerated]
    internal static int <Foo>g__Sum|0_0(int a, int b)
    {
        return a + b;
    }
}

For code sample 2:

public class C
{
    [CompilerGenerated]
    [StructLayout(LayoutKind.Auto)]
    private struct <>c__DisplayClass0_0
    {
        public int sum;
    }

    private void Foo()
    {
        C.<>c__DisplayClass0_0 <>c__DisplayClass0_;
        C.<Foo>g__Sum|0_0(1, 2, ref <>c__DisplayClass0_);
    }

    [CompilerGenerated]
    internal static void <Foo>g__Sum|0_0(int a, int b, ref C.<>c__DisplayClass0_0 ptr)
    {
        ptr.sum = a + b;
    }
}

在第二个示例中,创建一个存储sum 的结构会产生少量开销。

除此之外,关于哪个“最好”确实是主观的。在我看来,样本 1 更容易理解。不过,您是否同意纯属见仁见智。

我要表达强烈意见的唯一一件事是不要执行选项 3。在我看来,重复使用相同的名称 sum 简直令人困惑。同样,这只是纯粹的观点。

【讨论】:

    【解决方案2】:

    简单的答案是:如果您可以编写函数以便它们不需要修改成员变量,您会发现它们更容易测试并且不太可能影响程序其余部分的行为意想不到的方式。 对于像您的示例这样的示例,我能想到的将计算结果存储在成员变量中的少数几个很好的原因之一是,这样做的成本是否特别高,并且您需要在未来的各种未指定点使用结果.

    【讨论】:

      【解决方案3】:

      第一种方式似乎是最合法的,因为它不违反查询-命令分离原则。如果方法的返回类型是Int32(第三个示例),我希望该方法不会更改任何状态,但是它确实会将变量的值更改为超出其范围。第二个例子更好,但仍然过于含蓄。如果您的目标是退货 - 退货。关心接下来会发生什么不是您的责任。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多