带参初始化类问题:ControllerClass初始化ListManager遇字段初始化器错误
解决“无法在字段初始值设定项中引用非静态字段”的问题
这个问题我太熟悉啦!你遇到的是C#类初始化顺序的典型问题,咱们一步步来拆解解决:
为什么会报错?
在C#的类初始化逻辑里,字段初始值设定项(就是你直接在类中写ListManager listManager = new ListManager(...)的代码)会在类的构造函数执行之前运行。
这时候你的growthRate和startLength这两个非静态字段还没完成初始化,编译器出于安全性考虑,不允许你用未初始化的非静态字段来初始化另一个字段——这就是为什么硬编码数值(比如new ListManager(30,30))没问题,但用非静态字段就会抛出那个错误。
最适合你的解决方案
既然你希望参数只在ControllerClass中一处定义、便于维护,最直接的方法就是把listManager的初始化逻辑移到ControllerClass的构造函数里:
修改后的ControllerClass代码:
public class ControllerClass { int growthRate = 50; int startLength = 500; ListManager listManager; // 先声明字段,暂不初始化 // 在构造函数中完成初始化 public ControllerClass() { listManager = new ListManager(startLength, growthRate); } /* Starts the Gui */ public void RunProgram() { Application app = new Application(); app.Run(new MainWindow(this)); } ... }
这样做的好处:
- 构造函数执行时,
growthRate和startLength已经完成初始化,用它们实例化ListManager完全合法 - 参数依然集中在
ControllerClass中,后续修改只需要改这一处,完全满足你的维护需求
可选方案(根据业务场景选择)
如果这些参数是所有ControllerClass实例共享的固定值,你也可以把参数改成静态字段,这样字段初始值设定项就能直接使用它们:
public class ControllerClass { static int growthRate = 50; // 添加static修饰符 static int startLength = 500; ListManager listManager = new ListManager(startLength, growthRate); // 现在可以正常使用 public void RunProgram() { Application app = new Application(); app.Run(new MainWindow(this)); } ... }
注意:静态字段是所有类实例共享的,如果你需要每个ControllerClass实例拥有独立的参数值,那第一种构造函数的方案更适合你。
内容的提问来源于stack exchange,提问作者bv_Martn
相关产品推荐
相关产品推荐

