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

C# 13(.Net 9) 中的新特性 - 半自动属性的更多相关文章

  1. 使用示例带你提前了解 Java 9 中的新特性

    使用示例带你提前了解 Java 9 中的新特性 转载来源:https://juejin.im/post/58c5e402128fe100603cc194 英文出处:https://www.journa ...

  2. ASP.NET 5与MVC 6中的新特性

    差点忘了提一句,MVC 6中默认的渲染引擎Razor也将得到更新,以支持C# 6中的新语法.而Razor中的新特性还不只这一点. 在某些情况下,直接在Web页面中嵌入某些JSON数据的方式可能比向服务 ...

  3. Webpack 3 中的新特性

    本文简短地分享下最新发布的 Webpack 3 中的新特性,供大家参考. 1. Webpack 3 的新特性 6 月 20 日,Webpack 发布了最新的 3.0 版本,并在 Medium 发布了公 ...

  4. HTML 5中的新特性

    HTML 5中的新特性 html5新增了一些语义化更好的标签元素.首先,让我们来了解一下HTML语义化. 1.什么是HTML语义化? 根据内容的结构化(内容语义化),选择合适的标签(代码语义化)便于开 ...

  5. (数据科学学习手札73)盘点pandas 1.0.0中的新特性

    本文对应脚本及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 毫无疑问pandas已经成为基于Pytho ...

  6. 1 PHP 5.3中的新特性

    1 PHP 5.3中的新特性 1.1 支持命名空间 (Namespace) 毫无疑问,命名空间是PHP5.3所带来的最重要的新特性. 在PHP5.3中,则只需要指定不同的命名空间即可,命名空间的分隔符 ...

  7. iOS7开发中的新特性

        iOS7到现在已经发布了有一段时间了.相信你现在已经了解了它那些开创性的视觉设计,已经了解了它的新的API,比如说SpirteKit,UIKit Dynamics以及TextKit,作为开发者 ...

  8. Spring Framework 5 中的新特性

    https://www.ibm.com/developerworks/cn/java/j-whats-new-in-spring-framework-5-theedom/index.html Spri ...

  9. JDK8中的新特性

    1.lambda表达式 1.定义 Java 8 发布的最重要新特性.Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中),可以推导出来的就可以省略了,Lambda 表达式免去了使用匿 ...

  10. Java 各个版本中的新特性

    新特性你知道多少? Java 8 Lambda 表达式 接口增加默认方法等 方法引用 流 Stream Java 9 模块系统 交互式工具jshell .of() 创建不可变集合 接口支持私有方法 更 ...

随机推荐

  1. JVM的本地方法栈-通俗理解

    1.本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的, 2.其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的N ...

  2. 8月5日CSP-S模拟赛赛后总结

    8月5日CSP-S模拟赛赛后总结 \[8月5日 \ \ CSP-S模拟赛 \ \ 赛后总结 \\ 2024年8月5日 \\ by \ \ \ uhw177po \] 一.做题情况 第一题比赛 \(10 ...

  3. 构建无服务器数仓(三 )EMR Serverless 操作要点、优化以及开放集成测试

    引言 在数据驱动的世界中,企业正在寻求可靠且高性能的解决方案来管理其不断增长的数据需求.本系列博客从一个重视数据安全和合规性的 B2C 金融科技客户的角度来讨论云上云下混合部署的情况下如何利用亚马逊云 ...

  4. 在LCD上的任意位置显示一张任意大小的jpg图片

    /************************************************* * * file name:lcdshowjpg.c * author :momolyl@126. ...

  5. RabbitMq消息可靠性之回退模式 通俗易懂 超详细 【内含案例】

    RabbitMq保证消息可靠性之回退模式 介绍 生产者生产的消息没有正确的到达队列就会触发回退模式,进行二次发送 前提 完成SpringBoot 整合 RabbitMq 中的Topic通配符模式 一. ...

  6. PHP转Go系列 | ThinkPHP与Gin框架之打造基于WebSocket技术的消息推送中心

    大家好,我是码农先森. 在早些年前客户端想要实时获取到最新消息,都是使用定时长轮询的方式,不断的从服务器上获取数据,这种粗暴的骚操作实属不雅.不过现如今我也还见有人还在一些场景下使用,比如在 PC 端 ...

  7. 如何阅读 diff 命令的输出

    diff 命令有三种模式:上下文模式(context),合并模式(unified)和普通模式(normal).其中最常用的是合并模式. 合并模式 diff -u f1 f2 --- f1 2024-0 ...

  8. CSS – Naming Conversion

    参考: CSS Naming Conventions that Will Save You Hours of Debugging Class Name kebab-case .hero-section ...

  9. dfs 油滴拓展——洛谷p1378

    油滴扩展 题目描述 在一个长方形框子里,最多有 \(N\) 个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完毕才能放置下一 ...

  10. dfs与贪心算法——洛谷5194

    问题描述: 有n个砝码,将砝码从大到小排列,从第三个砝码开始,所有砝码均大于其前两个砝码之和,问怎样的砝码组合才可以组合出不大于c的最大重量,输出该重量 输入: 第一行输入两个个整数N,c,代表有N个 ...