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

C#带主构造函数的位置记录类型如何为各生成部分添加独立文档注释

C#带主构造函数的位置记录类型如何为各生成部分添加独立文档注释

嘿,这个问题确实戳中了C# positional records的一个小痛点——既要保留那种一行搞定的简洁语法,又要给自动生成的四个部分(record类型、Capacity属性、主构造函数、构造参数Capacity)都加上各自独立的文档注释,对吧?我来给你理清楚可行的方案:

首先得明确默认情况:如果用最简洁的写法:

public record Box(double Capacity);

你加的XML注释会让Box类型和主构造函数共享同一个<summary>,Capacity属性和构造参数也共享同一个<param>注释,完全没法区分开。

方案一:区分属性与构造参数(保留部分简洁性)

如果你只需要给属性和构造参数加独立注释,而类型和构造函数的summary可以共用,那可以用半显式的写法——保留主构造函数的positional参数,但显式声明属性,这样就能给属性单独加注释了:

/// <summary>
/// A container for items.
/// </summary>
/// <param name="Capacity">Specifies the size of the box(这是构造参数的注释)</param>
public record Box(double Capacity) {
    /// <summary>
    /// Returns the size of the box.(这是属性的独立注释)
    /// </summary>
    public double Capacity { get; init; } = Capacity;
}

这种写法还保留了主构造函数的简洁性,同时解决了属性和构造参数注释混淆的问题,唯一的小遗憾是类型和主构造函数还是共用同一个summary。

方案二:四个部分完全独立注释(需放弃最简洁写法)

如果连类型和主构造函数的注释都要完全分开,那目前没有办法保留最简洁的positional record语法,必须显式声明构造函数和属性,这样每个部分都能加专属注释:

/// <summary>
/// A container for items.(这是Box类型的注释)
/// </summary>
public record Box {
    /// <summary>
    /// Returns the size of the box.(这是Capacity属性的注释)
    /// </summary>
    public double Capacity { get; init; }

    /// <summary>
    /// Creates a new Box instance.(这是主构造函数的独立注释)
    /// </summary>
    /// <param name="Capacity">Specifies the size of the box(这是构造参数的注释)</param>
    public Box(double Capacity) {
        this.Capacity = Capacity;
    }
}

虽然看起来失去了record的“一行优雅”,但换来了对每个生成部分的完全注释控制权。

总结

截至目前的C#版本(包括C# 12),如果想要四个部分都有独立注释,就必须放弃最简洁的positional一行写法;如果只是要区分属性和构造参数,半显式的写法就能兼顾简洁性和注释需求。

备注:内容来源于stack exchange,提问作者spdtech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 12:33:07