在C#XNA中声明,实例化和使用委托

时间:2009-02-19 06:14:57

标签: c# visual-studio-2008 xna

我正在尝试按标题所示,但我感到困惑。

我知道委托应该如何工作,但Visual Studio告诉我我错了。说明如何执行此操作的Microsoft文档包含一个复杂的示例,该示例使用包含模板的书店程序和一堆难以理解的逻辑代码。

你是怎么做到的?感谢。

2 个答案:

答案 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);

...如果这是你真正的意思,你就忘记了一个参数,这就是方法解析失败的原因。