如何在C#中创建只读属性?附本人尝试的代码示例
C# 只读属性创建方法及代码解析
下面结合你提供的代码,逐一解析C#中创建只读属性的几种常见方式:
1. 自动实现的只读属性(C# 6+)
这种方式只定义get访问器,没有set,属性值只能在构造函数或属性初始化时赋值:
// 在构造函数中赋值的只读属性 public string Title { get; } // 抽象类中的只读属性,子类必须实现get逻辑 public abstract string? Html { get; }
你的Title属性写法正确,在构造函数中完成赋值是标准用法;Html作为抽象只读属性,子类继承时需要实现其getter逻辑。
2. 表达式体只读属性
用箭头表达式=>简化只读属性的逻辑,适合逻辑简单的计算属性,每次访问属性时都会执行表达式:
public int RatingCount => UserEmail.Count;
这里RatingCount直接返回UserEmail字典的元素数量,写法简洁高效。
3. 带自定义逻辑的只读属性
如果只读属性需要复杂计算逻辑,可以用完整的get块实现,同样不定义set访问器:
public decimal? AverageRating { get { decimal sum = UserEmail.Values.Sum(); return RatingCount > 0 ? (sum / RatingCount) : null; }}
你的AverageRating实现正确,通过判断评分数量是否大于0来返回平均评分或null,符合只读属性的要求。
4. 集合类型的只读封装
对于集合类型,直接暴露可变集合(比如List<T>)会导致外部可以修改集合内容,正确的做法是内部保留可变集合,对外暴露只读集合接口:
// 内部私有可变集合,用readonly修饰确保引用不可变 private readonly List<Comment> _comments = new(); // 对外暴露只读集合接口,防止外部修改 public IReadOnlyList<Comment> Comments => _comments.AsReadOnly();
你的代码里_comment写成了私有自动属性,建议改成readonly字段更符合常规写法,同时变量名改为复数_comments和属性名Comments保持一致。
代码中的错误修正
你的构造函数里存在拼写错误:
public Post(User user, string title) { uesr = user; // 错误:拼写错误,应为正确的变量名(假设类中有对应的User字段/属性) Title = title; }
修正后示例(补充User相关定义):
private readonly User _user; public User User => _user; public Post(User user, string title) { _user = user; Title = title; }
完整修正后的代码示例
public abstract class Post { public string Title { get; } public abstract string? Html { get; } public int RatingCount => UserEmail.Count; public decimal? AverageRating { get { decimal sum = UserEmail.Values.Sum(); return RatingCount > 0 ? (sum / RatingCount) : null; }} private readonly List<Comment> _comments = new(); public IReadOnlyList<Comment> Comments => _comments.AsReadOnly(); private readonly Dictionary<string, int> UserEmail = new(); private readonly User _user; public User User => _user; public Post(User user, string title) { _user = user; Title = title; } } public class Comment { /* 评论类定义 */ } public class User { /* 用户类定义 */ }
内容的提问来源于stack exchange,提问作者Nabil-almrstani
相关产品推荐
相关产品推荐

