c# 将变量传递给类
Posted
技术标签:
【中文标题】c# 将变量传递给类【英文标题】:c# passing variables to class 【发布时间】:2016-02-15 16:24:00 【问题描述】:这是我的游戏类的示例(打开 opentk 图形窗口)
class Game : GameWindow
public Game() : base(320, 240, OpenTK.Graphics.GraphicsMode.Default, "OpenTK Quick Start Sample")
VSync = VSyncMode.On;
protected override void OnLoad(EventArgs e)
base.OnLoad(e);
GL.ClearColor(0.1f, 0.2f, 0.5f, 0.0f);
GL.Enable(EnableCap.DepthTest);
protected override void OnRenderFrame(FrameEventArgs e)
int i =1;
//does stuff
游戏类是这样开始的:
public partial class tk1 : Form
public tk1()
InitializeComponent();
private void tk1_Load(object sender, EventArgs e)
Game game;
this.Show();
game = new Game();
game.Run(30.0);
在原始示例中,游戏实例包含在“使用”语句中,但我认为没有它没有区别,我不能做的一件事是让游戏全局化, 我为什么要?因为我不知道如何用 tk1.numbericUpDown1.value 更新游戏实例中的“i”...... 解释?
【问题讨论】:
你知道using
在你的上下文中是什么意思吗?
在类级别将 i 设置为 Game 类中的公共实例成员?
【参考方案1】:
1. 使用using
语句,以便Game
对象在使用后(当 using 语句结束时)正确处理。
通常,当您使用 IDisposable 对象时,您应该声明并 在 using 语句中实例化它。 using 语句调用 以正确的方式处理对象上的方法,并且(当你使用它时 如前所示)它还会导致对象本身超出范围 一旦调用 Dispose。
建议正确处置您的游戏对象,否则您很可能会发生内存泄漏。如果你更新你的代码,让 Game 变量是类作用域(而不是方法),你可以在类的终结器中释放它。
~tk1()
_game.Dispose();
更多info.
2. 为完成您的需要,您不想创建 Game 对象的本地实例,因为每当方法执行完毕后,您将无法再在其他地方使用它.相反,请将您的 Game 对象移动到类级别。
public partial class tk1 : Form
private Game _game;
public tk1()
InitializeComponent();
private void tk1_Load(object sender, EventArgs e)
this.Show();
if (_game == null) _game = new Game();
_game.Run(30.0);
【讨论】:
+1 !我试过这个例子效果很好! (当我公开游戏时我的失败了)也感谢你对 dispose 的解释,这将清理我一直注意到使用其他类文件的问题,我将把 using 放回去,但 c# 不应该自动处理吗? @doggy 你是对的。 C# 确实具有内置的垃圾收集,但其中很多与基于框架决定“收集”的时间的不同条件有关。请参阅此处了解更多信息:msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx。此外,如果这对您有所帮助,并且您认为您的问题得到了解答,请不要忘记按复选标记接受答案:) 再次感谢大家!在我获得更好的代表后,我的复选标记将显示给你们!...只需要多 2 分!【参考方案2】:您应该将您的 i
字段设为公共或将其设为公共属性,以便您可以从外部访问它。
class Game : GameWindow
public int i;
public Game() : base(320, 240, OpenTK.Graphics.GraphicsMode.Default, "OpenTK Quick Start Sample")
VSync = VSyncMode.On;
protected override void OnLoad(EventArgs e)
base.OnLoad(e);
GL.ClearColor(0.1f, 0.2f, 0.5f, 0.0f);
GL.Enable(EnableCap.DepthTest);
protected override void OnRenderFrame(FrameEventArgs e)
i =1;
//does stuff
然后您可以从 tk1 类访问该字段。
public partial class tk1 : Form
Game game;
public tk1()
InitializeComponent();
private void tk1_Load(object sender, EventArgs e)
this.Show();
game = new Game();
game.Run(30.0);
game.i = 10;
private void numbericUpDown1_Click (object sender, EventArgs e)
game.i = tk1.numbericUpDown1;
【讨论】:
谢谢,虽然它通过了,但它在加载过程中只执行一次,在数字框更改时不会更新(即使将 10 更改为 numericupdown.value 后) @doggy 这只是你如何与我合作的线索。你可以对我做任何你想做的事。我用每次点击 numbericUpDown1 后更新 i 的示例更新了答案。以上是关于c# 将变量传递给类的主要内容,如果未能解决你的问题,请参考以下文章