如何在主程序无需传入输入即可激活类的setter方法?
问题分析与解决方案
你的核心问题在于混淆了属性赋值逻辑和用户输入获取逻辑,且强类型的int属性限制了外部传入非整数类型的值,导致无法在setter中完成有效的整数校验。同时原代码的setter直接调用Console.ReadLine()覆盖了外部传入的value,完全违背了属性setter的设计意图。
以下是两种符合你需求(setter负责校验整数有效性)的实现方案:
方案一:使用object类型属性(兼容多类型输入)
这种方案允许属性接收int或string类型的输入,在setter中统一校验转换:
internal class Dummy { private int _number; public object Number { get { return _number; } set { int intValue = 0; bool isValid = false; // 校验传入值是否为整数或可转换为整数的字符串 if (value is int) { intValue = (int)value; isValid = true; } else if (value is string inputStr && int.TryParse(inputStr, out intValue)) { isValid = true; } if (isValid) { _number = intValue; Console.WriteLine($"The number is {_number}."); } else { Console.WriteLine("That is not a number."); } } } }
主程序调用示例:
var dummy = new Dummy(); // 直接传入用户输入的字符串 dummy.Number = Console.ReadLine(); // 也可直接传入整数 dummy.Number = 456;
方案二:拆分输入属性与数值属性(符合单一职责)
将用户输入的字符串接收与整数校验放在专门的输入属性中,数值属性仅负责提供存储的整数值:
internal class Dummy { private int _number; // 对外暴露的只读数值属性,返回存储的整数 public int Number { get { return _number; } } // 用于接收用户输入的属性,setter负责校验转换 public string NumberInput { set { if (int.TryParse(value, out int intValue)) { _number = intValue; Console.WriteLine($"The number is {_number}."); } else { Console.WriteLine("That is not a number."); } } } }
主程序调用示例:
var dummy = new Dummy(); // 传入用户输入的字符串 dummy.NumberInput = Console.ReadLine(); // 后续可通过dummy.Number获取存储的整数 Console.WriteLine($"Stored number: {dummy.Number}");
原代码问题说明
- 类型不匹配错误:
Number是int类型属性,外部只能传入int值,直接传Console.ReadLine()(返回string)会触发编译错误。 - 崩溃原因:使用
Convert.ToInt32(Console.ReadLine())时,若输入非数字,Convert方法会直接抛出FormatException导致程序崩溃,而int.TryParse()才是安全的容错转换方式。 - 逻辑错误:原setter中直接调用
Console.ReadLine()覆盖了外部传入的value,导致主程序的赋值操作完全无效,必须在setter中重新输入,违背了属性setter的职责。
内容的提问来源于stack exchange,提问作者somebody1122
相关产品推荐
相关产品推荐

