C#中如何调用其他函数内创建的类实例(Godot引擎开发场景)
C# 跨函数访问类实例的实现方法
你遇到的核心问题是:main函数中创建的ExampleClass实例属于函数局部变量,默认作用域仅局限在main函数内部,其他函数无法直接访问,可通过以下几种常用方案实现需求:
- 补充注意:C#是大小写敏感的语言,你定义的方法名为
SetData,调用时要和定义的大小写保持一致,否则会抛出找不到方法的异常。
- 方案1:将实例作为参数传入目标函数(首选方案)
这是耦合度最低、最符合封装规范的实现方式,调用目标函数时直接把创建好的实例作为参数传递即可,同时需要给ExampleClass新增读取私有字段data的公开方法:
public class ExampleClass { private float data; public void SetData(float setData) { data = setData; } // 新增公开Get方法,供外部读取data的值 public float GetData() { return data; } } public void main (){ float dataStorage; // 注意变量名不要用关键字Class,避免命名冲突 ExampleClass myClass = new ExampleClass (); myClass.SetData(1.0f); // 把实例作为参数传入returnData dataStorage = returnData(myClass); } // 给returnData新增ExampleClass类型的参数 public float returnData (ExampleClass targetClass){ float getData = targetClass.GetData(); return getData; }
- 方案2:将实例定义为所属类的成员字段
如果main和returnData属于同一个自定义类,你可以把ExampleClass实例提升为所属类的成员字段,类内部的所有函数都可以直接访问该实例,适合实例生命周期和所属类一致的场景:
// 假设两个方法都归属在Game类下 public class Game { // 类成员字段,整个类内部可访问 private ExampleClass _myClass; public void main (){ float dataStorage; _myClass = new ExampleClass (); _myClass.SetData(1.0f); dataStorage = returnData(); } public float returnData (){ float getData = _myClass.GetData(); return getData; } }
Godot开发中,很多当前脚本全局常用的实例都会用这种方式存储。
- 方案3:使用静态变量存储实例(谨慎使用)
如果需要跨不同类全局访问这个实例,可以用静态变量存储,仅适合全局单例场景使用:
public class ExampleClass { // 静态实例,全局可直接访问 public static ExampleClass Instance; private float data; public ExampleClass() { // 构造函数中给静态实例赋值 Instance = this; } public void SetData(float setData) { data = setData; } public float GetData() { return data; } }
调用时直接访问静态实例即可:
public float returnData (){ float getData = ExampleClass.Instance.GetData(); return getData; }
注意:静态变量会常驻内存,如果你会创建多个
ExampleClass实例,该方案会覆盖之前的实例,仅保留最后创建的实例,非单例场景不推荐使用。
如果你是在Godot引擎中开发,还可以通过Godot内置的节点查找方法获取挂载在其他节点上的脚本实例,比如GetNode<ExampleClass>("对应节点路径"),可以直接拿到目标节点上的ExampleClass脚本对象,无需手动传递参数。
内容的提问来源于stack exchange,提问作者Nilhope
相关产品推荐
相关产品推荐

