从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
相关产品推荐
相关产品推荐

