Jas*_*ung 9 c# methods pinvoke delegates unmanaged
我认为委托实例可以与函数实例互换.
请使用以下代码:
delegate int AddDelegate(int a, int b);
AddDelegate DelegateInstance;
public void DoStuff()
{
//I can call this without a delegate "instance":
MethodThatTakesAdd(Add);
//I can also call it WITH a delegate "instance"
DelegateInstance = Add;
MethodThatTakesAdd(DelegateInstance);
}
public int Add(int a, int b)
{
return a + b;
}
public void MethodThatTakesAdd(AddDelegate addFunction)
{
Console.WriteLine(addFunction(1, 2).ToString());
}
Run Code Online (Sandbox Code Playgroud)
两种方式称它为APPEAR是等价的,如果你只使用C#,你将永远不会看到差异(至少我还没有达到这一点).但是,我最近是一个回调到这个托管代码的非托管代码,它们的处理方式不同.例如,在一个场景中,如果我直接将函数用作回调(即使我的对象实例被保留),我也会得到错误"对垃圾收集的委托进行了回调".使用"委托实例"可以解决问题.
那里有人知道有什么区别吗?
Jar*_*Par 13
术语更正:代替方法指针,更合适的术语是方法组.
在功能方面,这两个陈述是等价的.那就是他们产生几乎相同的IL.不同之处在于存储委托值的位置.
在第一种情况下,您直接传递方法组Add to MethodThatTakesAdd.这会导致创建临时委托值,然后传递给MethodThatTakesAdd.在MethodThatTakesAdd返回时,此委托值将进行垃圾回收,因为它不存储该值.
在第二种情况下,您将委托分配给外部实例上的字段.这通常会增加委托的生命周期,从而减少在pinvoke调用期间收集垃圾的机会.
归档时间: |
|
查看次数: |
3311 次 |
最近记录: |