首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >定义类型为void的类属性(而不是方法)

定义类型为void的类属性(而不是方法)
EN

Stack Overflow用户
提问于 2015-11-16 20:17:53
回答 2查看 175关注 0票数 1

我正在尝试构建一个名为GameObject (用于consoleApplication游戏)的类,并且GameObject应该有一个函数"onFrame“,即每0.1秒调用一次。

但是问题是,对于每个gameObject来说,这个函数(void)应该是唯一的--假设我有GameObject: G1,G2。G1将在它的onFrame中增加一个变量1,G2将在控制台上打印一些东西(只是示例)。

有可能这样做吗?

我试过这样做:

代码语言:javascript
运行
复制
class GameObject 
{
    public void onFrame;

    public GameObject (void of) //constructor
    {
        onFrame = of;
        Thread t = new Thread(runOnFrame);
        t.isBackgroundThread = true;
        t.Start();
    }

    protected void runOnFrame () 
    {
        while (true)
        {
            Thread.Sleep(100);
            if (onFrame != null) onFrame(); //EDIT: that (0) was typed by mistake
        }
    }
}

其主要职能如下:

代码语言:javascript
运行
复制
public static int i = 0;
static void Main (string[] args)
{
    GameObject G1 = new GameObject(new void (){
        i++;
    });
    GameObject G2 = new GameObject(new void () {
        Console.WriteLine("OnFrame is being called!");
    })
}

但这似乎不是正确的方法。有可能吗?我该怎么做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-16 20:20:09

您要寻找的是一个Action,它与void委托相同:

代码语言:javascript
运行
复制
class GameObject 
{
    public Action onFrame;

    public GameObject (Action of) //constructor
    {
        onFrame = of;
        Thread t = new Thread(runOnFrame);
        t.isBackgroundThread = true;
        t.Start();
    }

    protected void runOnFrame () 
    {
        while (true)
        {
            Thread.Sleep(100);
            if (onFrame != null) onFrame();
        }
    }
}

但是,我建议使用Timer,而不是在连续循环中调用thread.Sleep

传递委托的一种方法是使用lambda语法:

代码语言:javascript
运行
复制
GameObject G1 = new GameObject(() => i++ );

()是空输入参数集的占位符:

票数 6
EN

Stack Overflow用户

发布于 2015-11-16 20:29:00

你需要的是一名代表。

您的"onFrame“定义应该如下所示:

代码语言:javascript
运行
复制
public delegate void SimpleDelegate();
public SimpleDelegate onFrame;

您的构造函数将变成如下:

代码语言:javascript
运行
复制
public GameObject (SimpleDelegate of)
{
    onFrame = of;
    Thread t = new Thread(runOnFrame);
    t.isBackgroundThread = true;
    t.Start();
}

后来,像这样的事情:

代码语言:javascript
运行
复制
GameObject G1 = new GameObject(new SimpleDelegate(() => {
    i++;
}));

.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33743873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档