You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带参初始化类问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:32:21