C#类属性set方法null报错、赋值校验失效求修复
两类错误的核心根因
- 错误1(运行时第14行提示name为null):
Name属性的set访问器校验逻辑对象错位。代码判断长度时取的是私有字段name本身的属性,而非待赋值的value。C#中string类型私有字段的默认值为null,第一次给Name赋值时,代码会直接访问null对象的Length属性,必然触发空引用异常。即便字段非空,该判断也是拿旧值的长度当校验依据,完全没有校验即将存入的新值长度,逻辑从根源上不成立。 - 错误2(范围外的成绩仍被正常存储):
Grade1、Grade2属性的set访问器存在和Name完全一致的逻辑错位:校验范围时取的是私有字段grade1、grade2的当前值,而非待赋值的value。int类型私有字段的默认值为0,本身就在0-100的合法区间内,因此无论传入的成绩是-30还是150,判断条件拿默认值0做参照永远满足要求,会直接把非法值存入字段,根本不会触发错误提示。
修复方案
- 修正Name属性的set校验逻辑:优先判断传入的
value是否为空白值,避免空引用,同时用value的长度做合法性校验,替换原有对旧字段name的长度判断。 - 修正Grade1、Grade2属性的set校验逻辑:将判断条件中的旧字段
grade1、grade2全部替换为传入的value,真正校验新传入数值的合法范围。 - 修正Average属性的整数截断问题:原代码两个int值相加后除以整数2,会直接丢失小数精度,改为除以2.0触发浮点除法即可。
修正后的核心属性代码参考:
// 修正后的Name属性 public string Name { get => name; set { if (!string.IsNullOrWhiteSpace(value) && value.Length <= 15) { name = value; } else { Console.WriteLine("姓名长度不能超过15字符,请检查输入"); } } } // 修正后的Grade1属性,Grade2的逻辑完全一致 public int Grade1 { get => grade1; set { if (value is >= 0 and <= 100) { grade1 = value; } else { Console.WriteLine("成绩必须在0-100范围内,请检查输入"); } } } // 修正后的Average属性 public double Average { get => (grade1 + grade2) / 2.0; }
内容的提问来源于stack exchange,提问作者john555
相关产品推荐
相关产品推荐

