我正在尝试按标题所示,但我感到困惑。
我知道委托应该如何工作,但Visual Studio告诉我我错了。说明如何执行此操作的Microsoft文档包含一个复杂的示例,该示例使用包含模板的书店程序和一堆难以理解的逻辑代码。
你是怎么做到的?感谢。
答案 0 :(得分:4)
在您的示例中,我假设您希望SetGameAreaWithCallback
方法在changeGameArea
的实例上实际调用Game1
方法。
要执行此操作,您需要创建委托实例,以便它引用该方法:
// game1 is the instance of the Game1 class that you want to call
// Instantiate the handler
SetGameAreaDelegate handler = new SetGameAreaDelegate(game1.changeGameArea);
如果您使用的是C#2或更高版本,则语法更简单:
// game1 is the instance of the Game1 class that you want to call
// Instantiate the handler
SetGameAreaDelegate handler = game1.changeGameArea;
答案 1 :(得分:2)
委托是一个安全的函数指针,您应该为该名称的声明变量分配一个方法,而不是尝试分配您正在执行的类型。
class MyGameClass
{
SetGameAreaDelegate handler;
MyGameClass()
{
// Instantiate the handler (since my callback is a non-static method)
// You'll need to preform this assignment in the constructor, 'this'
// is not valid during initialization
handler = new SetGameAreaDelegate(myGameAreaWithCallback);
handler = MyGameAreaWithCallback; // short for above
}
void MyGameAreaWithCallback(Game1.gameAreas newArea)
{
//...
}
}
委托是函数指针的托管包装器。它有自己的类型签名,可能是原始函数指针的替代保存。委托可以保存对实例对象的引用,比如C ++样式的成员函数指针,但是你永远不必担心这个,因为运行时会为你找出这种信息。
知道非静态方法的委托将跟踪对该对象的引用可能会很好。这可能导致内存不被垃圾收集,因为代理可能看起来无害,维护或跟踪对象引用。
您的代码存在的问题是类型签名......
void SetGameAreaWithCallback(Game1.gameAreas newArea, SetGameAreaDelegate callback)
...与您的委托类型不匹配...
delegate void SetGameAreaDelegate(Game1.gameAreas newArea);
......为此工作......
SetGameAreaDelegate handler = SetGameAreaWithCallback;
......你的代表本来应该......
delegate void SetGameAreaDelegate(Game1.gameAreas newArea, SetGameAreaDelegate callback);
...如果这是你真正的意思,你就忘记了一个参数,这就是方法解析失败的原因。