Age属性未生效:输入16未返回预期的Invalid Age结果
问题:Age属性校验逻辑未生效
当前程序输出Age :: 16,但按照属性的校验规则,输入16应该输出Age :: Invalid Age。核心问题是构造函数直接给字段赋值,完全跳过了属性的校验逻辑。
原始代码
Main.cs
//File Main.cs using BasicClasses; namespace ConsoleApp1 { class Program { static void Main(string[] args) { Profile p = new Profile("16"); p.PrintProfile(); } } }
Profile.cs
//File Profile.cs namespace BasicClasses { class Profile { //Fields public string age; //Constructors public Profile(string age) { this.age = age; } //Properties private string Age { get { return this.age; } set { if (value.Length > 0) { if (Int32.Parse(value) >= 18) { Age = value; } else { Age = "Invalid Age"; } } else { Age = "Not Defined"; } } } //Methods public void PrintProfile() { Console.WriteLine($"Age :: {Age}"); } } }
实际输出
Age :: 16
问题分析
- 构造函数绕开属性校验:你在构造函数里直接给
public字段age赋值,根本没调用Age属性的setter方法,所以校验逻辑从头到尾没执行过。 - 属性setter藏着递归陷阱:原代码里
Age = value会反复调用自身的setter,运行时会直接抛出StackOverflowException,这是个隐藏bug。 - 字段权限设计不合理:把
age设为public,意味着任何地方都能直接修改字段,完全违背了用属性做校验的初衷。
修复方案
修改Profile.cs,做以下3处调整:
- 把字段
age改成私有,禁止直接访问; - 构造函数里赋值给
Age属性,触发校验逻辑; - 修正属性setter的递归问题,直接给私有字段赋值。
修改后的Profile.cs
//File Profile.cs namespace BasicClasses { class Profile { //Fields:改为私有,仅通过属性操作 private string age; //Constructors:赋值给属性,触发校验 public Profile(string age) { Age = age; } //Properties:修正递归,直接操作私有字段 private string Age { get { return this.age; } set { if (value.Length > 0) { if (int.Parse(value) >= 18) { this.age = value; } else { this.age = "Invalid Age"; } } else { this.age = "Not Defined"; } } } //Methods public void PrintProfile() { Console.WriteLine($"Age :: {Age}"); } } }
修正后输出
Age :: Invalid Age
额外优化建议
- 可以把
Age属性设为public,这样外部也能通过属性合法修改年龄,同时保留校验逻辑; - 解析字符串转整数时用
int.TryParse,避免非法格式导致的异常:if (int.TryParse(value, out int parsedAge) && parsedAge >= 18) { this.age = value; } else { this.age = "Invalid Age"; }
内容的提问来源于stack exchange,提问作者Cottoncreeper
相关产品推荐
相关产品推荐

