C# 当一个对象调用其中一个时';它是闭包的一种情况吗?对象作为第一个变量传递给方法?
我想我理解闭包是如何在C#和.NET中实现的。当CLR检测到函数将在其作用域之外传递并作用于自由变量时,它会将函数和变量打包到自定义类中 那么这与C# 当一个对象调用其中一个时';它是闭包的一种情况吗?对象作为第一个变量传递给方法?,c#,.net,closures,clr,C#,.net,Closures,Clr,我想我理解闭包是如何在C#和.NET中实现的。当CLR检测到函数将在其作用域之外传递并作用于自由变量时,它会将函数和变量打包到自定义类中 那么这与对象调用自己的函数时发生的情况有何不同呢?对象本身作为第一个变量传递到函数中,这样,如果函数需要对象的任何其他函数、属性或字段,它就可以访问它们 我想我在这里遗漏了一些东西,我想对这两种情况下发生的情况做一些解释:闭包,以及对象调用自己方法的情况。对对象的普通方法调用与闭包无关;只有将该方法调用打包为委托时,才有闭包 为了理解发生了什么,你需要很好地掌
对象调用自己的函数时发生的情况有何不同呢?对象
本身作为第一个变量传递到函数中,这样,如果函数需要对象的任何其他函数、属性或字段,它就可以访问它们
我想我在这里遗漏了一些东西,我想对这两种情况下发生的情况做一些解释:闭包,以及对象调用自己方法的情况。对对象的普通方法调用与闭包无关;只有将该方法调用打包为委托时,才有闭包
为了理解发生了什么,你需要很好地掌握“价值类型”和“参考类型”的概念。在.net中谈论对象
是不够明确的,因为对象
位于所有层次结构的底部,包括值类型(int
也是对象
)。开始考虑对纯引用类型(如类实例)的方法调用要容易得多
以普通类变量和实例化为例:
List x; // variable declaration
x = new List(); // instantiation
或者,在一行上:
List x = new List();
实例的“主体”将保留在称为堆的内存区域中。您正在使用的x
只保存对该内存区域的引用,这就是为什么称之为引用类型的原因
使用x
变量调用列表上的方法时,该方法需要知道在哪个列表上工作。因此,该方法仅获取对实例主体的引用作为第一个参数,this
参数。说CLR或编译器传递“对象”是不正确的,因为对象总是在堆上,它只传递引用(或指针)
当该方法需要调用同一对象的不同方法时,它只需将相同的this
作为第一个参数传递,即它自己接收的参数
正常的方法调用如下所示:
x.Add(Something); // calls instance method "Add" on "x"
当编译器看到它知道使用x
作为调用Add
的this
(第一个参数,隐藏参数)的引用时。这里没有“关闭”的意思
以下是关闭的情况:
List<int> A = new List<int>();
List<int> B = new List<int>();
Action<int> aDelegate; // <-- declare a delegate type variable
// Action<int> is a delegate that returns void and
// takes a single int parameter.
aDelegate = A.Add; // <-- initialize the delegate using an instance method of object A
aDelegate(7); // <- notice the call! No reference to "A" because "A" is already stored in aDelegate
aDelegate = B.Add;
aDelegate(8); // <- notice the call! No reference to "B" because "B" is already stored in aDelegate
List A=新列表();
列表B=新列表();
行动特使;//我能投两次票吗???快速提问:你说“注意电话!对“A”的引用是隐藏的”…它是隐藏的吗?或者,代理
aDelegate
是否已经引用了a
,因此“a”
不需要传递到对aDelegate
的调用中?由于“A”
已经存储在aDelegate
中,当调用aDelegate
上的Invoke并依次调用Add
时,它只是将对A
的引用作为第一个参数传递到Add
,我还没有读过整件事……我知道我只是说了和你已经解释过的一样的话。:-)你能给我解释一下封闭式和开放式代理吗?或者我应该为此打开一个新的QA?