首页 > 编程语言 >C#13的属性更甜了,Java不要太羡慕

C#13的属性更甜了,Java不要太羡慕

时间:2024-06-20 09:58:53浏览次数:20  
标签:field 13 set Java get C# int public 属性

本文将为大家介绍C#13的属性语法优化,同时回顾属性的所有写法。

众所周知,C#的属性相对于对标语言,比如说Java,是一个超级甜点。C#13更进一步,在属性的getter和settter中,引入了field关键字,表示后备字段(backing field),这样可以少写一行模板代码,更加的简洁,属性也更具有独立人格(更像一种独立成员了)。大家看一下面这段代码,是不是很爽?

//之前,如果我们要使用getter和setter,控制Age的读取和写入,需要添加后备字段
public class Person
{
    private int _age;
    public int Age
    {
        get => _age /2;
        set => age * 2;
    }
}

//C#13,我们可以这样写了,爽哇~~~
//field是一个新的关键词,表示该属性的后备字段
//减少了一行烦人的模板代码
//这样的属性是不是更有独立人格了?
public class Person
{
    public int Age
    {
        get => field /2;
        set => field * 2;
    }
}

Java这时候肯定又要说,切~~~啥玩意,我一个get和set方法,搞定全部,弄这么多语法糖干啥,多增加心智负担呀,“一招鲜,吃遍天 ”不香嘛!!!

嗯~~~,我们还是忆苦思甜,回顾一下C#的属性,看它是如何一步步走过来了,一个属性要走到今天这个样子,并不容易。但语言要发展,始终是要迈开步子往前走。咱们也顺便做做代码体操,复习一下。

public MyClass
{
    //最开始一个完整的属性
    //初诞生时,如果熟悉了Java的get和set方法,可能会觉得有些别扭
    private int _myProperty1; //未初始化,默认值为0
    public int MyProperty1
    {
        get { return _myProperty; }
        set { _myProperty = value; }
    }

    //使用Lambda简化
     private int _myProperty2;
    public string MyProperty2
    {
        get => _myProperty2;
        set => _myProperty2 = value;
    }

    
    //再次简化,省略了后备字段
    //很简洁,但无法定制具体的get和set方法
    public int MyProperty3{ get;set } //简写方式②:最简化
    
    public int MyProperty4{ get; } = 10; //只读属性初始化方式1,有后备字段
    public int MyProperty5 => 10;//只读属性初始化方式2,无后备字段
    
    public int MyProperty6 { get; private set; } //只在类的内部可写
    public int MyProperty7 { get; protected set; } //只在派生类中可写
    public int MyProperty8 { get; internal set; } //只在程序集中可写
    public int MyProperty9 { get; protected internal set; } //只在派生类或程序集中可写
    
    public int MyProperty10 { get; init; } //在构造函数或初始化构造器中初始化
}

有了field,玩XAML的兄弟姐妹们,有没有一点小兴奋,以后咱们可能就可以像下面这么写MVVM了>>>!!!

public class MyViewModel : BindableBase
{
    //属性
    //注意看,所有属性的get和set的模板代码是一样的,是否可以进一步简化?
    public string MyProperty1
    {
        get { return field; }
        set { SetProperty(ref field, value); }
    }

    //命令
    public ICommand MyCommand => field ??= new DelegateCommand(Execute, CanExecute);
}

瞬间CommunityToolkit.Mvvm也不那么香了!!!

其实,省略后备字段模板代码的提案在C#12就有了,但那个时候还不够香(比如使用“@field”这样的关键字),但这次够香了,不要鸽呀~~~


你期待这个语法糖吗???兄弟们评论区交流~~~


我是functionMC > function MyClass(){…}
C#/TS/鸿蒙/AI/中美科技竞争等问题,以及如何写Bug、防脱发、送外卖等问题,都可以私信我提问哦!

标签:field,13,set,Java,get,C#,int,public,属性
From: https://blog.csdn.net/2401_85195613/article/details/139823534

相关文章

  • cbrutekrag:一款针对SSH服务器的渗透测试工具
    关于cbrutekragcbrutekrag是一款针对SSH服务器的渗透测试工具,该工具基于C语言开发,可以帮助广大研究人员使用字典攻击来对目标SSH服务器执行渗透测试。该工具仅出于教育目的设计和开发,请在获得测试授权后再使用该工具。 工具要求libssh 工具下载广大研究人员可以使......
  • Java项目-基于springboot+vue的学习平台(源码+数据库+文档)​
    源码获取:https://download.csdn.net/download/u011832806/89456223基于SpringBoot+Vue的学习平台开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括学习平台......
  • 0day 未公开 U8+CRM V13-V16.5系统存在任意文件读取漏洞
     0x01阅读须知        技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用......
  • Apple - Authorization Services Programming Guide
    本文翻译整理自:AuthorizationServicesProgrammingGuide(更新日期:2011-10-19https://developer.apple.com/library/archive/documentation/Security/Conceptual/authorization_concepts/01introduction/introduction.html#//apple_ref/doc/uid/TP30000995文章目录一......
  • [AAAI2024]Out-of-Distribution Detection in Long-Tailed Recognition with Calibrat
    这篇文章设置的问题是:考虑长尾分布的训练集下,对测试集上的OOD样本进行检测。作者在训练集中引入了openset样本学习异常表征,以OCL(OutlierClassLearn)为baseline,训练时引入prototype方法,推理时对logits进行调整校准。问题背景DNNs会把OOD(out-of-distribution)样本误分类为ID(in-di......
  • C/C++ 内存安全注意事项
    C/C++内存安全相关的注意事项主要如下:避免数组越界访问:数组越界是一种常见的安全漏洞,可能导致程序崩溃或被黑客利用。在访问数组元素时,应确保下标值不超过数组的边界。可以使用边界检查或安全的访问函数来预防此类问题。防止内存泄漏:C/C++中,内存管理需要程序员手动进行。......
  • 【C#】WPF 使用Storyboard故事板做动画效果
    <Stylex:Key="ButtonAnimationBlueStyle"BasedOn="{x:Null}"TargetType="{x:TypeButton}"><SetterProperty="Template"><Setter.Value><ControlTem......
  • linux - curl
    curl(commandlineuniformresourcelocator),URL命令行,用于发送http请求场景:项目运维过程中,如果没有postman工具,会用到这些命令;docker容器内,如果没有开放端口,只能进容器内用curl进行测试了。#不带有任何参数时,curl默认发出GET请求。curlhttps://www.baidu.com......
  • HieRec论文阅读笔记
    HieRec:HierarchicalUserInterestModelingforPersonalizedNewsRecommendation论文阅读笔记Abstract现存的问题:​ 用户兴趣建模对于个性化新闻推荐至关重要。现有的新闻推荐方法通常从每个用户以前的行为中学习一个单一的用户嵌入,以代表他们的整体兴趣。然而,用户兴趣通......
  • linux - cat
    系统运维中,查看日志时,最经常使用的就是grep、cat和tail三个命令。cat(英文全拼:concatenate)命令,用于连接文件并打印到标准输出设备上。命令语法:cat[选项][文件]参数选项:-n:显示行号;-b:显示非空行号;-s:合并空白行;-E:在每行结尾添加$符号;-T:将制表符显示为^I,tab键......