use*_*696 1 .net c# delegates memory-management
在C#中,我们有值类型和引用类型.我很清楚一些代码
public class Employee
{
// Code for Employee goes here
}
public class Program
{
public void Main(string[] args)
{
Employee someEmployee;
someEmployee = new Employee();
// Do something with someEmployee
}
}
Run Code Online (Sandbox Code Playgroud)
当我们做员工一些员工; 运行时在堆栈上分配内存足以保存保存Employee数据的堆的地址.someEmployee = new Employee(); 然后在堆上分配内存,初始化所需的内容,最后将地址放在变量someEmployee上.
然后堆上的内容就是Employee拥有的数据.很容易理解someWmployee持有对我们以前看到的包含数据的内存片段的引用.
现在,代表指向一个方法.但这意味着什么?什么意思指向一种方法?一个方法像其他数据一样保存在堆中?这让我感到困惑,因为一个方法不仅仅是一堆数据,而是一堆指令,那么存储指令应该是什么意思呢?
您可以将委托视为这样的事情
public class Action : Delegate
{
private object instance;
private MethodInfo method;
public void Invoke()
{
method.Invoke(instance, new object[]{});
}
}
Run Code Online (Sandbox Code Playgroud)
现在,很明显,这不完全是那样,并且有很多语法糖和直接运行时支持等等,但这应该会给你一些关于发生了什么的想法.委托只是一种类型,就像一个类.它将导致堆上的内存分配表示方法和调用它的(可选)实例,并且作为委托键入的变量保存对此对象的引用.