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获取同一个实例,就能读取到用户输入的数据。
代码不规范/低效点改进
冗余存储:同时维护List和数组
不需要同时保留_inputList和_inputListArray,List可以随时通过ToArray()生成数组,单独存数组会增加维护成本(比如忘记同步更新)。可以去掉数组字段,在需要的时候直接调用_inputList.ToArray(),或者在属性中动态返回。属性设计不严谨
如果直接暴露List的setter(比如public List<float> InputList { get; set; }),外部类可以直接替换整个List,破坏数据完整性。应该用只读属性(只保留getter),如果需要添加数据,提供专门的方法(比如AddNumber(float num)),而不是让外部直接操作List。静态方法实例未复用
InputToArray的ReadNumberInput方法里初始化了InitialNumberInput对象,但没有把这个实例传递给其他类或存储起来,导致其他类只能新建空实例,这是核心逻辑漏洞。字段安全性优化
可以给私有List字段加readonly修饰(private readonly List<float> _inputList = new List<float>();),这样可以避免代码不小心替换List的引用,只能修改List内部的元素,提升数据安全性。
内容的提问来源于stack exchange,提问作者mageff

