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
相关产品推荐
相关产品推荐

