C#类中依赖其他属性的Sex属性访问时报错,是什么原因导致的?
代码存在的核心问题
- 属性自引用导致无限递归:你在
Sex属性的get/set访问器内直接读写this.Sex,该操作会再次触发属性自身的get/set逻辑,形成无限递归,最终会抛出栈溢出异常。属性本身不存储值,你需要额外定义一个私有字段作为存储载体(即 backing 字段)。 - 可空类型访问风险:就算不存在递归问题,当
Sex为null时直接调用.Value属性,会直接抛出InvalidOperationException异常。 - 空引用未校验:如果
SexString未赋值为null,调用Trim()方法时会直接抛出NullReferenceException异常。
修复后的参考代码
public class Person { // 私有存储字段,用于存储Sex属性的实际值 private int? _sex; public string SexString { get; set; } public int? Sex { get { // 仅当存储字段为null时,根据SexString计算值 if (_sex == null) { if (string.IsNullOrWhiteSpace(SexString)) { _sex = 3; } else { var sexLower = SexString.Trim().ToLower(); _sex = sexLower switch { "female" => 1, "male" => 0, _ => 3 }; } } return _sex; } set { // 合法范围0-3直接赋值,否则赋值为3 if (value is >= 0 and <= 3) { _sex = value; } else { _sex = 3; } } } }
内容的提问来源于stack exchange,提问作者Iria
相关产品推荐
相关产品推荐

