如何在C#的DateTime类型get;set属性中加入条件语句判断年龄是否满16
解决你的C# DateTime属性校验问题
我来帮你梳理下代码里的问题,咱们一步步修正:
1. 首先解决调用报错的问题
你在Main里写的dob.Dob()是错误的——Dob是属性,不是方法,不能用方法调用的括号语法。正确的用法是:
- 获取值:
var userBirthday = dob.Dob; - 赋值:
dob.Dob = new DateTime(2007,12,1);
2. 修正年龄校验的逻辑漏洞
你当前的年份差判断太粗糙,只看年份会忽略月日的精确性。比如今天是2024年5月1日,用户生日是2008年6月1日,年份差是16,但实际用户还没满16岁,你的逻辑会误判。
正确的做法是直接判断「生日加上16年是否小于等于当前日期」,这样能精确校验是否满16岁。
3. 让构造函数也走校验逻辑
你原来的构造函数直接给私有字段_Dob赋值,跳过了set属性里的校验,这会导致不符合要求的生日也能创建对象。应该在构造函数里调用属性的set方法,让校验逻辑统一生效。
修正后的完整代码
Test类:
class Test { private DateTime _Dob; public DateTime Dob { get { return _Dob; } set { // 精确计算满16岁的日期 var sixteenYearsThreshold = value.AddYears(16); if (sixteenYearsThreshold > DateTime.Now) { Console.WriteLine("Error: 年龄必须超过16岁"); // 可选:如果需要强制报错,抛出异常更严谨 // throw new ArgumentException("年龄必须超过16岁"); } else { _Dob = value; } } } public Test(DateTime dob) { // 通过属性赋值,让构造时也执行校验 Dob = dob; } }
Main方法:
// 创建对象时会触发构造函数的校验 Test testUser = new Test(new DateTime(2007,12,01)); // 正确获取属性值 Console.WriteLine($"用户生日:{testUser.Dob:yyyy-MM-dd}"); // 尝试赋值一个未满16岁的生日,会触发错误提示 testUser.Dob = new DateTime(2009, 1, 1); Console.ReadLine();
内容的提问来源于stack exchange,提问作者Eddie Vu
相关产品推荐
相关产品推荐

