C#类间数据修改问询:如何在引用类中修改主类属性
解决Second类修改First类属性的问题(适配多实例场景)
首先先帮你修正代码里的几个语法小问题,这些问题会导致你的代码无法正常运行:
First类的run()和Second类的change()方法缺少返回类型,应该加上void;Second类的change()方法里引用的是first.x,但你的成员变量叫_first,应该改成_first.x = 2。
修正后的基础代码应该是这样的:
public class First { public int x = 0; public Second second; public First() { second = new Second(this); } public void run() { second.change(); } } public class Second { private First _first; public Second(First first) { _first = first; } public void change() { _first.x = 2; } }
为什么构造函数传this是可行的(适配多实例场景)
你提到Protrader会并行运行多个First实例,担心静态类导致数据泄漏,这个顾虑是对的,但通过构造函数传递this的方式完全不会有这个问题:
- 类是引用类型,当你在
First的构造函数里把this传给Second的构造函数时,Second的_first成员变量保存的是当前First实例的引用; - 每个
First实例都会创建自己专属的Second实例,不同First实例的Second持有的引用完全独立,操作的是各自First实例的属性,不会互相干扰,完美隔离多实例数据。
你尝试的ref this是没必要的——ref关键字主要用于值类型或者需要重新赋值引用的场景,而这里你只是修改First实例的属性,直接传递引用就足够了。
针对模块化需求的扩展方案
既然你计划把日志、事件、交易指令等功能拆分到专用类中,只需要给每个专用类都通过构造函数传递当前First实例的引用即可,每个类都能安全地访问和修改绑定的First实例属性,同时保持多实例隔离。
举个日志类的例子:
public class LogModule { private First _first; public LogModule(First first) { _first = first; } public void logState() { // 可以访问First的属性 System.out.println("当前First实例的x值:" + _first.x); // 也可以修改First的属性 _first.x = _first.x + 1; } }
然后在First类中初始化这个模块:
public class First { public int x = 0; public Second second; public LogModule logModule; public First() { second = new Second(this); logModule = new LogModule(this); } public void run() { second.change(); logModule.logState(); // 调用日志模块 } }
这种方式下,每个First实例的所有模块类都只和当前实例绑定,完全不会出现多实例数据泄漏的问题,同时也实现了代码的模块化拆分,让各个功能职责更清晰。
内容的提问来源于stack exchange,提问作者Camilo Chaves
相关产品推荐
相关产品推荐

