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# 将变量传递给类的主要内容,如果未能解决你的问题,请参考以下文章

Kivy 将变量传递给类中的函数

python 类中的变量传递给类中的函数

是啥导致 c++ std::string 变量在传递给类时给出冲突的定义

Python - 如何传递给类对象的函数参数类型(打字)

将类变量作为默认值分配给类方法参数

尝试将布尔 C# 变量传递给 javascript 变量并将其设置为 true