本地函数 - 分配变量
Local function - assigning variable
我想知道 "correct" 或 "recommended" 编写本地函数的方法是什么 return 是一个值并将其分配给 [=34= 中的变量] 功能。 (本地函数 "host" 的实际名称是什么?)
我看到了以下 3 种可能性(也许还有更多):
在局部函数中使用一个变量,return this 在最后
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
}
}
使用"parent"函数的变量并设置它并使用一个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;
}
}
第一种方式似乎最合法,因为它不违反查询-命令分离原则。如果方法的 return 类型是 Int32
(第 3 个示例),我希望该方法不会更改任何状态,但是它确实会更改变量的值超出其范围。第二个例子更好,但仍然过于含蓄。如果您的目标是 return 某事 - return 就可以了。关心接下来会发生什么不是你的责任。
简单的答案是:如果您可以编写不需要修改成员变量的函数,您会发现它们更容易测试并且不太可能影响其余部分的行为以意想不到的方式编程。
对于像你的例子这样的事情,我能想到的将计算结果存储在成员变量中的几个很好的理由之一是这样做特别昂贵,并且你需要在未来的各种未指定点使用结果.
如果我们将您的前两个代码示例放入 SharpLab,我们可以看到编译器将代码降低为:
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;
}
}
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
。
除此之外,"best" 确实是主观的。在我看来,示例 1 更容易理解。同意不同意纯属见仁见智
我唯一要表达强烈意见的是不要执行选项 3。重新使用相同的名称,sum
在我看来简直令人困惑。同样,这只是个人意见。
我想知道 "correct" 或 "recommended" 编写本地函数的方法是什么 return 是一个值并将其分配给 [=34= 中的变量] 功能。 (本地函数 "host" 的实际名称是什么?)
我看到了以下 3 种可能性(也许还有更多):
在局部函数中使用一个变量,return this 在最后
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 } }
使用"parent"函数的变量并设置它并使用一个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; } }
第一种方式似乎最合法,因为它不违反查询-命令分离原则。如果方法的 return 类型是 Int32
(第 3 个示例),我希望该方法不会更改任何状态,但是它确实会更改变量的值超出其范围。第二个例子更好,但仍然过于含蓄。如果您的目标是 return 某事 - return 就可以了。关心接下来会发生什么不是你的责任。
简单的答案是:如果您可以编写不需要修改成员变量的函数,您会发现它们更容易测试并且不太可能影响其余部分的行为以意想不到的方式编程。 对于像你的例子这样的事情,我能想到的将计算结果存储在成员变量中的几个很好的理由之一是这样做特别昂贵,并且你需要在未来的各种未指定点使用结果.
如果我们将您的前两个代码示例放入 SharpLab,我们可以看到编译器将代码降低为:
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;
}
}
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
。
除此之外,"best" 确实是主观的。在我看来,示例 1 更容易理解。同意不同意纯属见仁见智
我唯一要表达强烈意见的是不要执行选项 3。重新使用相同的名称,sum
在我看来简直令人困惑。同样,这只是个人意见。