首页 > 编程语言 >C# 13(.Net 9) 中的新特性 - 半自动属性

C# 13(.Net 9) 中的新特性 - 半自动属性

时间:2024-10-28 13:31:45浏览次数:3  
标签:13 string get C# name field Net 属性

C# 13 即 .Net 9 按照计划会在2024年11月发布,目前一些新特性已经定型,今天让我们来预览其中的一个新特性:

作者注:该特性虽然随着 C# 13 发布,但是仍然是处于 preview 状态的特性,请谨慎使用

半自动属性 Semi-auto properties

大家都知道,C# 早在 3.0 时候就添加了自动属性这个特性,让我们一起来回顾一下自动属性 :

public string Name { get; set; }

以上代码等价于下面的全手动实现的属性:

private string _name;

public string Name
{
    get
    {
        return _name;
    }
    set
    {
        _name = value;
    }
}

然后在C# 6.0 中,支持了 lambda 表达式来稍微简化一下

private string _name;

public string Name
{
    get => _name;
    set => _name = value;
}

可以看到,自动属性这个特性极大的方便了属性的书写,省略了大量的繁琐代码,手动属性需要自己手动声明属性背后对应的私有字段。

但是,当我们需要在获取或设置属性时自定义一些逻辑时,自动属性就无能为力了,只好退化成手动实现的属性,例如

 private string _name;

 public string Name
 {
     get => _name;
     set => _name = "Hello " + value;
 }

现在,C# 13 通过引入 field 关键字来解决这个问题,在允许自定义逻辑的基础上,可以不必自行声明对应的字段。

以上代码可以写成:

public string Name
{
    get => field;
    set => field = "Hello " + value;
}

进一步的,我们可以把 get 改成全自动属性的写法,也是支持的

public string Name
{
    get;
    set => field = "Hello " + value;
}

可以看到,半自动属性将极大的方便我们在拥有自定义逻辑字段上的代码编写。提高了代码的可读性,以及避免了字段名称的污染。

题外话,field 是一个上下文关键字,只在属性代码块中有效,例如在方法中使用 field 将不产生任何效果

public string Test()
{
    return field; // ERROR: The name 'field' does not exist in the current context
}

破坏性更新

需要注意的是,引入这个 field 关键字是一个破坏性更新,例如你的原有代码:

public int Age
{
    get
    {
        var field = 18;
        return field;
    }
}

原有代码里存在以 field 为名字的变量的话,当升级到 C# 13 时将改变行为,现在这个属性将返回 field 默认值" 0" 而不是期望的 "18 "

你需要进行如下修改以避免变量 field 被识别为关键字

public int Age
{
    get
    {
        var field = 18;
        return @field;
    }
}

结尾

这个特性经过数次的易稿,field 关键字也经过数次变更才最终确定,终于在今年推出了。

看起来一个简单的功能,但是在背后有千丝万缕的关系,以及存在的破坏性更新,可以看出 C# 团队在推出功能时需要考虑及照顾的东西有很多,所以速度难免会被拖慢。

最后,当前这个特性已经在 Visual Studio 2022 17.12 Preview 3.0 中实装,需要把 C# 语言版本设置为preview,大家可以自行尝试一下。

参考

csharplang/proposals/field-keyword.md at main · dotnet/csharplang

Proposal: field keyword in properties · Issue #140 · dotnet/csharplang

标签:13,string,get,C#,name,field,Net,属性
From: https://www.cnblogs.com/Rwing/p/18510363/Csharp_13_dot_net_9_preview_Semi-auto_properties

相关文章

  • C++之OpenCV入门到提高001:使用 Visual Studio2022 配置 OpenCV 环境
    一、介绍从今天开始,我们又要开始一个新的系列了,这个系列就是《C++之Opencv入门到提高》。这个系列是有关如何使用C++语言,通过Opencv来实现图像处理、缺陷检测、视频处理、机器学习等功能。OpenCV我也是新接触的,一步一步的学习,一步一步提高。这个系列是以C++为基......
  • [MRCTF2020]Xor
    [MRCTF2020]Xor检查无壳,32位分析打开main函数,发现不能F5反汇编如下报错,在分析401095位置处的指令出错.text:00401095callsub_401020此处是一个call指令,我们点进sub_401020函数f5反汇编成功打开然后返回到main函数按F5成功反汇编是个简单的异......
  • 基于pytorch的nonlocalblock
    论文《Non-localNeuralNetworks》为了满足即插即用的功能,本博客重写nonlocal块,并可以根据自己的喜好选择2D卷积或者3D卷积,并可以选择是否使用bn层或pool。nonlocalblock模块图3D代码如下:classNonlocal_3d(nn.Module):def__init__(self,dim,dim_inner,pool......
  • 详解:普通代码块和static代码块
    一、普通代码块        在Java中,普通代码块(也称为实例初始化块或非静态初始化块)是用于在创建对象时执行代码的特殊代码块。它用于初始化实例变量或执行一些每次创建对象时都需要执行的代码。普通代码块在每次创建对象时执行,并且每次执行都会重新执行其中的代码。普通......
  • FastReport .NET 2025.1.1 Crack
    FastReport.NETAlibraryforgeneratingreportsandcreatingdocumentsfor.NET8,Blazor,.NETCore,ASP.NET,MVCandWinFormsTryforfreeFastReport.NETLibraryforgeneratingreportsandcreatingdocumentsfor.NET8,Blazor,.NETCore,ASP.NET,......
  • 7系列可配置逻辑块(7 Series Configurable Logic Block,CLB)
    背景先前接触到的第一个FPGA架构相关的知识便是,可配置逻辑块ConfigurableLogicBlock,CLB),基于Xilinx的7系列FPGA,现在回过头来重新回顾一下。系列目录与链接基于Xilinx的7系列FPGA,笔者在对CLB进行学习、研究时,归纳并总结出了以下博文:1、分篇1:《7系列之查找表(Look-U......
  • Leetcode : 684. 冗余连接
    >Problem:684.冗余连接题解:冗余连接(RedundantConnection)题目描述给定一棵包含n个节点的树(节点值为1到n),向树中添加一条边后形成一个图。你的任务是找出一条可以删除的边,使得删除后剩余部分仍然是一棵有n个节点的树。如果有多个答案,返回在输入数组edges中......
  • Ignition连接西门子PLC地址对应关系
    我们以西门子S7-1200系列为例:第一步:建立驱动连接,在网关内驱动选择西门子S7-1200在Name填入连接名称。这里很重要设计器建立Tag时需要填写地址,在HostName填写IP地址第二部:打开设计器新建OPC的标准Tag []里面是我们驱动里面的连接名称,后面是PLC的地址,这里注意和其他SCAD......
  • 2024CSP-S 游记
    Day-inf打了一堆模拟赛,感觉还是比较稳,但是越临近csp就爆出一堆糖狮错误,不理解qwq。Day-1上午考了最后一次模拟赛,爆砍\(37pts\),宝宝T3都没有做出来,感觉考试状态不是很好,希望S组不要出现思路短路的情况qwq。下午摆摆摆。Day0狂刷板子的一天:刷了一堆图论的板子,莫名......
  • 邮件系统之Exchange 常用的端口
     1 Exchange常用的端口协议Port描述SMTPTCP:25SMTP服务使用TCP端口25。DNSTCP/UDP:53DNS侦听端口53。域控制器使用此端口。LSATCP:691MicrosoftExchangeRoutingEngine服务(RESvc)在此端口上侦听路由链接状态信息。LDAP......