Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当一个对象调用其中一个时';它是闭包的一种情况吗?对象作为第一个变量传递给方法?_C#_.net_Closures_Clr - Fatal编程技术网

C# 当一个对象调用其中一个时';它是闭包的一种情况吗?对象作为第一个变量传递给方法?

C# 当一个对象调用其中一个时';它是闭包的一种情况吗?对象作为第一个变量传递给方法?,c#,.net,closures,clr,C#,.net,Closures,Clr,我想我理解闭包是如何在C#和.NET中实现的。当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?