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

从Windows窗体传值至Main方法后无法修改数组的问题求助

问题分析与解决方案

嘿,我一眼就看出你遇到的问题根源了!你的ShipTypes属性写法有个致命小坑:每次访问这个属性时,它都会创建一个全新的string数组并返回。这意味着你在verifyButton_Click里拿到的数组只是个临时副本,修改它根本不会影响到任何持久化的对象——下次再获取ShipTypes的时候,又是一个全新的数组,之前的修改自然就没了。

先看看你的原代码问题点:

public string[] ShipTypes { 
    get { 
        string[] ships = new string[6]; 
        ships[0] = "Galaxy Class"; 
        ships[1] = "Galaxy Class"; 
        ships[2] = "Galaxy Class"; 
        ships[3] = "Galaxy Class"; 
        ships[4] = "Galaxy Class"; 
        ships[5] = "BattleCruiser"; 
        return ships; 
    } 
}

解决方案:把数组变成类的私有字段

我们需要把数组实例化为类的成员变量,让它在类的生命周期里保持同一个实例,这样修改才会生效。调整后的代码如下:

// 先定义一个私有字段来保存数组实例
private string[] _shipTypes;

// 在类的构造函数里初始化这个数组
public YourFormClassName()
{
    InitializeComponent();
    // 一次性初始化数组
    _shipTypes = new string[6];
    _shipTypes[0] = "Galaxy Class";
    _shipTypes[1] = "Galaxy Class";
    _shipTypes[2] = "Galaxy Class";
    _shipTypes[3] = "Galaxy Class";
    _shipTypes[4] = "Galaxy Class";
    _shipTypes[5] = "BattleCruiser";
}

// 现在属性直接返回这个私有字段
public string[] ShipTypes { 
    get { return _shipTypes; }
    // 如果需要外部可以直接设置整个数组,就加上set;如果只允许修改元素,就只留get
    set { _shipTypes = value; }
}

现在修改数组就会生效了

在你的按钮点击事件里,直接修改ShipTypes的元素即可,因为现在它返回的是同一个数组实例:

public void verifyButton_Click(object sender, EventArgs e)
{
    // 比如修改第一个元素
    ShipTypes[0] = "Enterprise Class";
    // 现在再访问ShipTypes[0],就能看到修改后的结果了
}

简单来说,核心问题就是你之前的属性每次都返回新数组,修改的是临时对象;改成私有字段后,整个类共享同一个数组实例,修改自然就能持久化啦。

内容的提问来源于stack exchange,提问作者Jeff White

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:53:21