使用void类型(不是方法)定义类属性

时间:2015-11-16 20:17:54

标签: c# oop void

我正在尝试构建一个名为GameObject的类(用于consoleApplication游戏),而GameObject应该有一个函数" onFrame"这就是所谓的,每0.1秒一次。

但问题是,这个函数(void)应该对每个gameObject都是唯一的 - 让我们说我有GameObject:G1,G2。 G1会在它的onFrame中将变量增加1,而G2会在控制台上打印一些内容(只是示例)。

有可能吗?

我试着这样做:

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
        }
    }
}

主要功能:

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!");
    })
}

但它似乎不是正确的方法...... 可能吗?我该怎么做?

2 个答案:

答案 0 :(得分:6)

您正在寻找的是Action,与void代表相同:

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语法:

GameObject G1 = new GameObject(() => i++ );

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

答案 1 :(得分:1)

您需要的是代表。

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

public delegate void SimpleDelegate();
public SimpleDelegate onFrame;

你的构造函数会变成这样:

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

然后,这样的事情:

GameObject G1 = new GameObject(new SimpleDelegate(() => {
    i++;
}));

.....