定义类型为 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++;
}));
.....
我正在尝试构建一个名为 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++;
}));
.....