繁体   English   中英

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

[英]Declare, Instantiate, and Use a Delegate in C# XNA

我正在尝试按照标题所示进行操作,但是我感到困惑。

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

你怎么做到这一点? 谢谢。

在您的示例中,我假设您希望SetGameAreaWithCallback方法实际上在Game1的实例上调用changeGameArea方法。

为此,您需要创建您的委托实例,以便它引用该方法:

// 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;

委托是安全的函数指针,您应该向该名称的声明变量分配方法,而不要尝试分配自己正在执行的类型。

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

...如果这确实是您的意思,则您忘记了参数,这就是方法解析失败的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM