前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >C# 13 支持 Partial Property 了

C# 13 支持 Partial Property 了

作者头像
JusterZhu
发布2025-01-23 20:39:04
发布2025-01-23 20:39:04
3100
代码可运行
举报
文章被收录于专栏:JusterZhuJusterZhu
运行总次数:0
代码可运行

C# 13 支持 Partial Property 了

Intro

C# 13 扩展了 partial 的支持,实现了对 partial property 的支持,得益于 partial property 的支持,正则表达式 source generator 之前只支持 partial method,在 .NET 9 也将支持 partial property

Sample

来看简单的使用示例:

代码语言:javascript
代码运行次数:0
复制

file partial class PartialPropertyClass
{
    public partial int Num { get; set; }
}

file partial class PartialPropertyClass
{
    private int _num = 1;
    public partial int Num { get => _num; set => _num = value; }
}

file partial struct PartialPropertyStruct
{
    [DisplayName("Number")]
    public partial int Num { get; }
}

file partial struct PartialPropertyStruct
{
    [JsonPropertyName("num")]
    public partial int Num => 2;
}


partial property 既可以用于 class 也可以用于 struct

  • partial property 一处只有声明,一处要有实现,partial property 不支持自动属性,必须要有实现才可以,如果没有实现会得到一个 CS9250 的 error
代码语言:javascript
代码运行次数:0
复制
CS9250: a partial property cannot be automatically implemented
  • partial property 的实现必须要和声明处匹配,声明了 get; set;get; set; 都要有实现,有一个没有实现就会报错,会出现下面这样的报错
代码语言:javascript
代码运行次数:0
复制
CS9252: Property accessor 'PartialPropertyClass.Num.set' must be implemented because it is declared on the definition part
  • partial property 的实现要和声明匹配,没有声明也不能有实现,否则也会报错
代码语言:javascript
代码运行次数:0
复制
CS9253: Property accessor 'PartialPropertyClass.Num.set' does not implement any accessor declared on the definition part
  • partial property 只能一处声明,一处实现,不能两个地方定义声明或者两个地方定义实现,也会导致编译错误
代码语言:javascript
代码运行次数:0
复制
CS0102 The type 'PartialPropertyClass' already contains a definition for 'Num' CSharp13Samples
CS9250 A partial property may not have multiple defining declarations, and cannot be an auto-property.
...
  • partial property 在声明和实现的地方都可以添加 attribute 实际编译之后会合并到一起,例如前面的 PartialPropertyStruct 反编译之后会是下面这样

那么问题来了,如果 attribute 不允许出现多个,只能出现一个,在声明和实现的地方分别添加了 attribute 会怎么样呢?感兴趣的朋友可以自己尝试一下试试看看

  • partial property 还可以用作索引器
代码语言:javascript
代码运行次数:0
复制

file partial class PartialIndexer
{
    public partial string this[int index] { get; }
}

file partial class PartialIndexer
{
    public partial string this[int index] { get => index.ToString(); }
}

正则表达式 source generator 使用示例如下:

代码语言:javascript
代码运行次数:0
复制
[GeneratedRegex(@"^1[1-9]\d{9}$")]
private static partial Regex PhoneRegex();

[GeneratedRegex(@"^1[1-9]\d{9}$")]
private static partial Regex PhoneNumberRegex { get; }

var phone = "12312341234";
Console.WriteLine(PhoneRegex().IsMatch(phone));
Console.WriteLine(PhoneNumberRegex.IsMatch(phone));

二者输出的结果是一样的,只是一个正则是一个 method,另外一个是 property

More

partial property 的支持使得 Source Generator 支持的更加丰富,可玩性更好了

使用自动属性没有办法使用 partial property,那么我们只想通过 partial property 给属性添加 attribute 的话怎么实现呢,我们可以写一个实现

代码语言:javascript
代码运行次数:0
复制
file partial class PartialPropertyClass
{
    public partial int Num { get; set; }
}

file partial class PartialPropertyClass
{
    private int _num;
    [Display(Name = "Number")]
    public partial int Num { get => _num; set => _num = value; }
}

在有了 field keyword 支持之后,我们也可以做一个简化

代码语言:javascript
代码运行次数:0
复制
file partial class PartialPropertyClass
{
    public partial int Num { get; set; }
}

file partial class PartialPropertyClass
{
    [Display(Name = "Number")]
    public partial int Num { get => field; set => field = value; }
}

最后再留一个问题

代码语言:javascript
代码运行次数:0
复制
/// <summary>
/// My type
/// </summary>
partial class C
{
    /// <summary>Definition part comment</summary>
    /// <returns>Return value comment</returns>
    public partial int Prop { get; set; }
    
    /// <summary>Implementation part comment</summary>
    public partial int Prop { get => 1; set { } }
}

这样的声明和实现上都有文档注释,生成的 xml 文档最后会是什么样子呢?感兴趣的朋友可以自己试一下

References

  • https://github.com/dotnet/csharplang/issues/6420
  • https://github.com/dotnet/csharplang/blob/main/proposals/csharp-13.0/partial-properties.md
  • https://github.com/WeihanLi/SamplesInPractice/blob/main/net9sample/CSharp13Samples/PartialPropertySample.cs
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JusterZhu 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C# 13 支持 Partial Property 了
    • Intro
    • Sample
    • More
    • References
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档