You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 04:32:45