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

Defining a class property with type void (not a method)

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

但要注意的是,这个函数 (void) 对于每个游戏对象都应该是唯一的 - 假设我有游戏对象: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!");
    })
}

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

您要查找的是 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++ );

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

你需要的是一个代表。

您的 "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++;
}));

.....