C#中List<T>.Add方法在特定if/else代码块不生效的原因是什么?
问题原因及修复方案
核心问题点
- 实例重复重置:
Infint number1 = new Infint(); Infint number2 = new Infint();定义在operation循环内部,每次循环迭代都会生成全新的实例,operation=0阶段存入number1的所有数据,进入operation=1阶段就会被全部清空。 - 分支逻辑不匹配:你观察到Add不生效的场景基本都在operation=2的打印阶段,该阶段只会进入
operation == 2的分支,根本不会执行operation == 0分支内的Add语句,自然看不到添加效果。 - 读取逻辑存在边界缺陷:每行读取结束后未处理残留的换行符,若输入文件行数不足3行,后续operation循环不会进入while读取逻辑,也不会触发对应添加操作。
修复代码示例
internal class Infint { public bool isNegative { get; set; } public List<int> Number { get; set; } public Infint() { isNegative = false; Number = new List<int>(); } } static void Main(string[] args) { using (StreamReader sr = new StreamReader("infint.txt")) { int i; char num; // 将实例声明移到循环外,避免重复重置 Infint number1 = new Infint(); Infint number2 = new Infint(); for (int operation = 0; operation < 3; operation++) { number1.Number.Add(1); // 测试添加 i = sr.Read(); while (sr.Peek() >= 0) { number1.Number.Add(1); // 测试添加 if (i == 10 || i == 13) { // 跳过连续换行符 while (sr.Peek() == 10 || sr.Peek() == 13) sr.Read(); break; } num = (char)i; if (operation == 0) { number1.Number.Add(1); if (i == 45) number1.isNegative = true; else { number1.Number.Add((int)Char.GetNumericValue(num)); } } else if (operation == 1) { if (i == 45) number2.isNegative = true; else { number2.Number.Add((int)Char.GetNumericValue(num)); } } else if (operation == 2) { Console.WriteLine("counts of num1: " + number1.Number.Count); for (var k = 0; k < number1.Number.Count; k++) { Console.Write(number1.Number[k]); } Console.WriteLine("\ncounts of num2: " + number2.Number.Count); for (var k = 0; k < number2.Number.Count; k++) { Console.Write(number2.Number[k]); } } i = sr.Read(); } if (i == -1) { break; } } } Console.Read(); }
内容的提问来源于stack exchange,提问作者user17499624
相关产品推荐
相关产品推荐

