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

如何修改类内部数组的值?解决修改后值未生效问题

问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 16:25:17