C# Action变量引用的对象、被调用的方法或被调用的方法(也是Action)的返回值

C# Action变量引用的对象、被调用的方法或被调用的方法(也是Action)的返回值,c#,lambda,delegates,C#,Lambda,Delegates,我试图学习C#中的闭包。在观看YouTube教程的同时,我对闭包有了一些想法。我正在编写一个示例程序。在这个程序中,我调用一个名为GiveAction()的静态方法,该方法返回Action 现在,在类的Main方法中,当我们创建Action的新实例并将其引用到某个方法时。我对这个实例所指的对象感到困惑:GiveAction方法或者这个方法的返回值是b1(也是Action) 返回值也是一个操作。当我在调试时调用Action的这个实例时,我只能看到调用lambda函数的部分。这表明实例变量仅引用返回

我试图学习C#中的闭包。在观看YouTube教程的同时,我对闭包有了一些想法。我正在编写一个示例程序。在这个程序中,我调用一个名为
GiveAction()
的静态方法,该方法返回
Action

现在,在类的
Main
方法中,当我们创建
Action
的新实例并将其引用到某个方法时。我对这个实例所指的对象感到困惑:GiveAction方法或者这个方法的返回值是b1(也是Action)

返回值也是一个
操作
。当我在调试时调用
Action
的这个实例时,我只能看到调用lambda函数的部分。这表明实例变量仅引用返回值。但我不确定

私有静态动作GiveAction()
{
动作b1=空;
int i=4;
b1+=()=>
{
i++;
};
b1+=()=>
{
i+=10;
控制台写入线(i);
};
返回b1;
}
主要方法
static void Main(字符串[]args)
{
动作a1=给定动作();
a1();
}

不要选择最复杂的场景(合并多个委托并用其他方法调用它们)考虑一下一步一步地做这件事——在这之后,你要么了解整个事情,要么至少弄清楚你到底有什么问题,然后张贴以澄清…至少代码中的所有对象都有好的名称,这样您就可以在文本中引用它们,即将
action+=…
拆分为
action a1=…;动作+=a1我在代码中没有看到任何“实例变量”。在代码执行期间,只有一个委托实例。我在你的帖子里也没有看到任何问题。我有一种模糊的感觉,你的“问题”实际上根本不是关于委托,而是关于声明的局部变量、调用的方法、返回的值以及如何存储在变量中之间的关系。尽管如此,由于缺乏真正的问题,不可能确切知道你在问什么。“创建
操作的新实例,并将其引用到某个方法”——这是不准确的。您创建了一个新变量,但在到达lambda表达式之前没有实例,而该实例是使用
+=
@madreflection指定给
操作的实例,在“这是一个指定给操作的实例”上非常迂腐-
+=
将代理的现有
null
值与右侧。。。虽然它似乎总是选择以null开头的右侧,但这并不清楚,因为它是必需的行为-理论上,它可能总是分配新的委托,将
null
与右侧委托相结合(这样不太实际)。@AlexeiLevenkov:是的。我本可以进入这个领域,我几乎做到了,但这是一个太大的话题,不可能跳入其中,OP最需要的是对实例进行更正。这并不是说它选择了正确的一面(确实如此,但这是一个实现细节)
null
是代理的加法标识(无论它位于哪一侧)——就像
0
是实数的加法标识一样——并且由于代理是不可变的,因此不需要创建新实例。不管怎样,我想我们最后说的是同样的话。