前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C# 13(.Net 9) 中的新特性 - 半自动属性

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

作者头像
郑子铭
发布2024-11-26 08:54:05
发布2024-11-26 08:54:05
26700
代码可运行
举报
运行总次数:0
代码可运行

前言

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

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

半自动属性 Semi-auto properties

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

代码语言:javascript
代码运行次数:0
运行
复制
public string Name { get; set; }

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

代码语言:javascript
代码运行次数:0
运行
复制
private string _name;

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

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

代码语言:javascript
代码运行次数:0
运行
复制
private string _name;

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制
 private string _name;

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

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

以上代码可以写成:

代码语言:javascript
代码运行次数:0
运行
复制
public string Name
{
    get => field;
    set => field = "Hello " + value;
}

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

代码语言:javascript
代码运行次数:0
运行
复制
public string Name
{
    get;
    set => field = "Hello " + value;
}

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

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

代码语言:javascript
代码运行次数:0
运行
复制
public string Test()
{
    return field; // ERROR: The name 'field' does not exist in the current context
}

破坏性更新

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

代码语言:javascript
代码运行次数:0
运行
复制
public int Age
{
    get
    {
        var field = 18;
        return field;
    }
}

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

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

代码语言:javascript
代码运行次数:0
运行
复制
public int Age
{
    get
    {
        var field = 18;
        return @field;
    }
}

结尾

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

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

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

参考

  • https://github.com/dotnet/csharplang/issues/140
  • https://github.com/dotnet/csharplang/blob/main/proposals/field-keyword.md
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 半自动属性 Semi-auto properties
  • 破坏性更新
  • 结尾
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档