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

C#多类共享用户输入数组数据的问题求助

问题解决与代码优化建议

问题根源

你判断的完全正确——每次在其他类初始化InitialNumberInput对象时,都是创建了一个全新的独立实例,这个新实例的_inputList和_inputListArray都是默认空值,和之前在ReadNumberInput方法里初始化的实例毫无关联,自然拿不到数据。给数组加readonly报错是因为readonly修饰的字段只能在构造函数或字段初始化时赋值,而你是在运行时通过用户输入动态赋值,不符合规则;而且就算加上readonly,也解决不了实例不共享的核心问题。

解决方案

方案1:用静态字段存储共享数据

把InitialNumberInput里的核心数据改成静态字段,让所有实例共享同一份数据:

public class InitialNumberInput
{
    // 静态字段,所有实例共享同一份数据
    private static readonly List<float> _inputList = new List<float>();
    private static float[] _inputListArray;

    // 只读属性暴露数据,禁止外部直接修改引用
    public List<float> InputList => _inputList;
    public float[] InputListArray => _inputListArray;

    // 提供专门方法更新数组
    public static void UpdateInputArray()
    {
        _inputListArray = _inputList.ToArray();
    }
}

修改InputToArray的静态方法,直接操作静态字段:

public class InputToArray
{
    public static void ReadNumberInput()
    {
        string input;
        do
        {
            Console.Write("输入数字(回车结束):");
            input = Console.ReadLine();
            if (!string.IsNullOrEmpty(input) && float.TryParse(input, out float num))
            {
                InitialNumberInput.InputList.Add(num);
            }
        } while (!string.IsNullOrEmpty(input));

        // 更新共享数组
        InitialNumberInput.UpdateInputArray();

        // 此处遍历的是共享数据
        foreach (var num in InitialNumberInput.InputListArray)
        {
            Console.WriteLine(num);
        }
    }
}

后续其他类中,无论是直接访问静态属性还是创建InitialNumberInput实例,拿到的都是同一份输入数据:

// 其他类中使用
var inputData = new InitialNumberInput();
foreach (var num in inputData.InputListArray)
{
    Console.WriteLine(num); // 能读取到之前用户输入的所有数据
}

方案2:单例模式(控制实例唯一)

如果不想用静态字段,也可以让InitialNumberInput始终只有一个实例,所有类复用这个实例:

public class InitialNumberInput
{
    // 唯一实例
    private static InitialNumberInput _instance;
    // 私有构造函数,禁止外部随意new
    private InitialNumberInput() { }

    private readonly List<float> _inputList = new List<float>();
    private float[] _inputListArray;

    // 获取唯一实例的入口
    public static InitialNumberInput Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new InitialNumberInput();
            }
            return _instance;
        }
    }

    public List<float> InputList => _inputList;
    public float[] InputListArray => _inputListArray;

    public void UpdateInputArray()
    {
        _inputListArray = _inputList.ToArray();
    }
}

修改ReadNumberInput方法,使用单例实例:

public static void ReadNumberInput()
{
    var inputInstance = InitialNumberInput.Instance;
    string input;
    do
    {
        Console.Write("输入数字(回车结束):");
        input = Console.ReadLine();
        if (!string.IsNullOrEmpty(input) && float.TryParse(input, out float num))
        {
            inputInstance.InputList.Add(num);
        }
    } while (!string.IsNullOrEmpty(input));

    inputInstance.UpdateInputArray();
    // 遍历共享数据
    foreach (var num in inputInstance.InputListArray)
    {
        Console.WriteLine(num);
    }
}

其他类中通过InitialNumberInput.Instance获取同一个实例,就能读取到用户输入的数据。

代码不规范/低效点改进

  1. 冗余存储:同时维护List和数组
    不需要同时保留_inputList和_inputListArray,List可以随时通过ToArray()生成数组,单独存数组会增加维护成本(比如忘记同步更新)。可以去掉数组字段,在需要的时候直接调用_inputList.ToArray(),或者在属性中动态返回。

  2. 属性设计不严谨
    如果直接暴露List的setter(比如public List<float> InputList { get; set; }),外部类可以直接替换整个List,破坏数据完整性。应该用只读属性(只保留getter),如果需要添加数据,提供专门的方法(比如AddNumber(float num)),而不是让外部直接操作List。

  3. 静态方法实例未复用
    InputToArray的ReadNumberInput方法里初始化了InitialNumberInput对象,但没有把这个实例传递给其他类或存储起来,导致其他类只能新建空实例,这是核心逻辑漏洞。

  4. 字段安全性优化
    可以给私有List字段加readonly修饰(private readonly List<float> _inputList = new List<float>();),这样可以避免代码不小心替换List的引用,只能修改List内部的元素,提升数据安全性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:42:49