gpt4 book ai didi

c# - 为什么这段代码返回109?

转载 作者:太空宇宙 更新时间:2023-11-03 20:28:04 24 4
gpt4 key购买 nike

谁能告诉我它是如何工作的?我会很感激。不知道如何调试它。

using System;

class Prg
{
private static Func<double, Func<double, double>> Add(int c)
{
return x => y => x + y++ + (c *= 2);
}

public static void Main(string[] args)
{
int a = 1;
int b = 100;
var F = Add(2);
var G = F(a);
G(b);
Console.WriteLine(G(b));
}
}

编辑:如果你想享受我们的 C# 考试,我还有另一个。这是代码。

delegate int F(); 
class Prg { int a = 10;
public F Adder(int x) {
int i = x;
return delegate {
return a += i++; };
}
static void Main() {
Prg p = new Prg();
F f = p.Adder(5);
p.Adder(10);
f();
System.Console.Write(f());
} }

最佳答案

我的开头是:永远不要写这样的代码。

如果你真的想知道发生了什么:

  1. var F = Add(2) 行中,Add() 方法创建并返回一个 c==2 的 lambda 表达式。这里重要的是 c 被 lambda 捕获(您可以在 msdn 上阅读有关捕获变量的信息。
  2. var G = F(x) 行中,您只需使用参数 a = 1 调用您的函数,结果得到另一个函数,double -> double 准确地说。
  3. G(b) 行中,您正在调用您的函数,正是这个函数:x + y++ + (c *= 2); 现在:
    • x 等于 1
    • y是你的参数,它等于100
    • c 等于 2,但它被捕获了,所以它实际上是对某个已分配字段的引用
    • 这个表达式的结果是 105(100++ 返回 100,2 *= 2 返回 4),所以你得到 1 + 100 + 4 = 105。但是,更重要的是,捕获的变量 c 现在是等于4。y只是一个参数,所以它没有改变。
  4. Console.... 行中,您将再次调用您的函数。这一次,参数再次等于 100,所以结果是相同的,但是你捕获的变量 c 现在等于 4,所以你收到的结果是 1 + (100+) + (4 *= 2) -> 1 + 100 + 8 -> 109

这里有一个简短的例子,可能会阐明那里发生的事情:

class Prg
{
public static void Main(string[] args)
{
int captured = 5;
int param = 3;

var func = new Func<int, int>(x => x * captured);

Console.WriteLine(func(param));
captured = 6;
Console.WriteLine(func(param));

}
}

关于c# - 为什么这段代码返回109?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9245728/

24 4 0
文章推荐: Matlab对匿名函数的操作
文章推荐: javascript - 使
文章推荐: r - ODE 时代 Matlab 与 R
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com