gpt4 book ai didi

c# - 闭包行为

转载 作者:太空狗 更新时间:2023-10-29 20:54:36 25 4
gpt4 key购买 nike

此函数根据其调用方式返回两个不同的值。我知道闭包关闭变量,而不是值,我希望无论函数如何调用,第二次调用返回的值都是相同的

static Func<int, int,int> Sum()
{
var test = 1;
return (op1, op2) =>
{
test = test + 1;

return (op1 + op2) + test;
};
}

调用如下:

var mFunc = Sum();
Console.WriteLine("Calling Sum(1,1) with Invoke() " + Sum().Invoke(1, 1));
Console.WriteLine("Calling Sum(2,2) with Invoke() " + Sum().Invoke(2, 2));

Console.WriteLine("Calling mFunc(1,1)" + mFunc(1, 1));
Console.WriteLine("Calling mFunc(2,2)" + mFunc(2, 2));
Console.Read();

使用Invoke的结果:

4
6

使用赋值变量的结果:

4
7

为什么使用 Invoke 会改变闭包行为?

最佳答案

每次调用 Sum 时,您都会创建一个单独的 test 委托(delegate)来关闭新的 test 变量。区别不是“您是否使用 Invoke”,而是“您是否正在使用对 Sum() 的新调用的结果。

为了演示这一点,您只需将调用更改为:

var mFunc = Sum();
Console.WriteLine("Calling mFunc(1,1) with Invoke() " + mFunc.Invoke(1, 1));
Console.WriteLine("Calling mFunc(2,2) with Invoke() " + mFunc.Invoke(2, 2));
Console.WriteLine("----------");
Console.WriteLine("Calling mFunc(1,1)" + mFunc(1, 1));
Console.WriteLine("Calling mFunc(2,2)" + mFunc(2, 2));
Console.Read();

或者您可以改为每次调用 Sum:

var mFunc = Sum();
Console.WriteLine("Calling Sum()(1,1) with Invoke() " + Sum().Invoke(1, 1));
Console.WriteLine("Calling Sum()(2,2) with Invoke() " + Sum().Invoke(2, 2));
Console.WriteLine("----------");
Console.WriteLine("Calling Sum()(1,1)" + Sum()(1, 1));
Console.WriteLine("Calling Sum()(2,2)" + Sum()(2, 2));
Console.Read();

当然你不需要任何参数来证明这一点:

static Action Increment()
{
int test = 1;
return () =>
{
Console.WriteLine(test);
test++;
};
}

然后:

// New delegate for each call
Increment()(); // Prints 1
Increment()(); // Prints 1 again
Increment()(); // Prints 1 again

// Same delegate three times
var action = Increment();
action(); // Prints 1
action(); // Prints 2
action(); // Prints 3

关于c# - 闭包行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22412734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com