如何修改类内部数组的值?解决修改后值未生效问题
问题:Stats类数组修改后未生效的原因及解决办法
你创建了存储数组的Stats类,编写ChangeStat方法修改数组值,但运行后数组始终是默认值而非修改后的值。你的代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace problemexample { public class Stats { public int[] defStats = { 100, 15, 7 }; public void ChangeStat(int stat1, int stat2, int stat3) { defStats[0] = stat1; defStats[1] = stat2; defStats[2] = stat3; } } internal class Program { static void Setup() { Stats player = new Stats(); int[] stats = player.defStats; stats[0] = 150; stats[1] = 30; stats[2] = 10; player.ChangeStat(stats[0], stats[1], stats[2]); } static void Main(string[] args) { Setup(); Stats player = new Stats(); int[] stats = player.defStats; foreach (int i in stats) { Console.Write(i + " "); } Console.ReadKey(); } } }
错误原因
核心问题是你创建了两个完全独立的Stats实例:
- Setup方法里new的
player是局部实例,你修改的是这个实例的数组值,但该实例在Setup执行完毕后就会被销毁。 - Main方法里重新new了一个全新的
player实例,这个实例的数组自然是默认初始化值{100,15,7}。
另外,Setup里的操作存在冗余——直接修改player.defStats就已经能改变该实例的数组,没必要再调用ChangeStat方法。
解决办法
方案1:复用同一个Stats实例
让Setup方法返回修改好的实例,或者将实例作为参数传入Setup,确保Main里使用的是被修改过的那个实例:
using System; namespace problemexample { public class Stats { public int[] defStats = { 100, 15, 7 }; public void ChangeStat(int stat1, int stat2, int stat3) { defStats[0] = stat1; defStats[1] = stat2; defStats[2] = stat3; } } internal class Program { // 修改Setup返回实例 static Stats Setup() { Stats player = new Stats(); // 直接调用ChangeStat修改,或者直接操作数组都行 player.ChangeStat(150, 30, 10); return player; } static void Main(string[] args) { // 接收Setup中修改好的实例 Stats player = Setup(); foreach (int i in player.defStats) { Console.Write(i + " "); // 输出:150 30 10 } Console.ReadKey(); } } }
方案2:使用静态成员实现全局共享
如果你的Stats需要全局唯一的数组(所有实例共享同一组数据),可以把defStats改成静态成员:
using System; namespace problemexample { public class Stats { // 改为静态数组,所有实例共享 public static int[] defStats = { 100, 15, 7 }; public void ChangeStat(int stat1, int stat2, int stat3) { defStats[0] = stat1; defStats[1] = stat2; defStats[2] = stat3; } } internal class Program { static void Setup() { Stats player = new Stats(); player.ChangeStat(150, 30, 10); } static void Main(string[] args) { Setup(); // 直接访问静态数组 foreach (int i in Stats.defStats) { Console.Write(i + " "); // 输出:150 30 10 } Console.ReadKey(); } } }
注意事项
- 面向对象设计中,优先推荐方案1,因为静态成员会降低代码的灵活性和可测试性,仅适合全局唯一数据的场景。
- 如果你不需要ChangeStat方法,直接修改
defStats数组元素也是有效的,因为数组是引用类型,修改元素会直接影响实例中的数组。
内容的提问来源于stack exchange,提问作者cuna
相关产品推荐
相关产品推荐

