1 介绍

在C# 6.0 语法出来前,属性的赋初始值使用get;set;虽然已经相对于最原始的写法简洁了非常多,但是还不够,还不够,还不够。。。今天刚好一直在想着前几天朋友问我的有关属性赋初始值的问题,便自己试了一下,感觉6.0提供了更好的写法。

2 代码

(1)原始写法

在不知道哪个版本的C# 中,提供了最原始的写法。那么上代码看一下

        private string _text = null;public string text{get{return _text;}set{_text = value;}}

这应该是最原始的写法了,应该也算是最麻烦的一种写法。但是,接下来所说的所有写法,都算是语法糖,经过反编译之后,还是写成这种写法。

(2)6.0之前的写法

不得不提的是,巨硬真的是对开发者真的贴心,虽然经常会好心办坏事。那么看一下有了语法糖之后是怎么写的

    public string text{get;set;}

可以明显看出来,有了语法糖之后,真的是写起来非常舒服。那么就有一个问题:如果给属性赋初始值,在6.0语法出来以前,据我所知有两种

1 、构造函数

2、 不适用这个语法糖,用第一种写法

按照微软的贴心程度以及C#在语法糖的道路上越来越远,在6.0就提供了新的语法糖

(3)属性允许赋初始值

手握这颗语法糖,那么就可以使用新的写法了,那么来看一下:

     public string text{get;set;} = "王二狗";

可以明显看出来,这种写法是比较简单的。不慌,还有一颗糖可以吃。

(4)在属性/方法里面使用Lambda表达式

有了这颗糖,我们再来看一下怎么写:

 public string text => "二狗子";

那么这句是不是更简洁了,在6.0中允许使用lambda表达式赋初始值,根据lambda的一系列规则之下,就是这个样子了。具体lambda的规则,在这里我就不再详细解释了。

3 例子

上面只是最简单的用法,那么我们来举个栗子吧。

找个场景吧:在类里 ,有一个属性Text,属性类型为string

     public  string Text{get;set;}

现在需要根据string是不是为空来对另一个属性flag进行复制。那么我们看一下应该怎么写

(1)   原始写法

        private bool _flag = true;public bool flag{get{if (Text == ""){return true;}return false;}set{_flag = true;}}

使用最初的写法来写,以前也是一直都这么写的,确实是比较麻烦的,写了几次都记不住这个写法。

(2)新语法

public bool flag => Text == "" ? true : false;

比较一下吧,想一想,两种写法比较一下 ,哪个好很显然了。

4 总结

有些人数,C#的语法糖太多了,程序员都成了傻子了,但是实际用起来,还是会叫真香。

那么,为什么我不用2中(3)属性允许赋初始值这种写法呢? 因为水平有限,不会写。


开玩笑

       public bool flag{get;set;} = Text == "" ? true : false;

这种写法中,Text不可引用非静态字段,这样的情况下,那么就需要将Text加上一个static,变为非静态字段。

好啦 就写到这里吧,如有不正确,请指正!


2018.11.07日更新

针对使用ORM(主要是用反射)来对属性进行赋值时,会报错,进行补充说明。如果不是使用orm进行赋值,且在程序中不对该属性赋值,则不会报错。

(1)问题

先说下功能:实体类中有两个字段,是默认赋值的,原本使用lambda表达式进行赋初始值。

private string chkTypeBH => string.IsNullOrEmpty(parentChenkID) ? "01" : "02";private string chkTypeMC => string.IsNullOrEmpty(parentChenkID) ? "主动检查" : "到期复查";

那么在查询数据的时候,如果使用ORM进行属性的赋值,会提示未找到属性设置的方法。

那么查找一下原因吧。百度会告诉我们,这是因为属性没有set访问器原因。为什么会没有访问器呢?反编译看一下

前面我们提到了 ,属性的get;set;但是这里只有get,也就是该属性为只读属性。所以:因为没有提供set,所以会报错。

那么应该怎么做呢?提供三种思路吧

(1)设置为private

将属性设置为private,在反射的时候,是只获取public类型的字段,自然也就不会报错啦

(2)老老实实重写吧

采用老方法进行get;set;吧

         private string chkTypeBH;public string ChkTypeBH{get{return string.IsNullOrEmpty(this.parentChenkID) ? "01" : "02";}set{chkTypeBH = value;}}private string chkTypeMC;public string ChkTypeMC{get{return string.IsNullOrEmpty(this.parentChenkID) ? "主动检查" : "到期复查";}set {chkTypeMC = value;}}

(3)在反射中进行修改

在进行反射赋值时,加一句if(prop.canwrite)判断即可。

属性赋初始值的四种写法--C#6.0新特性相关推荐

  1. layui select日期_layui给下拉框、按钮状态、时间赋初始值的方法,按钮的状态

    layui给下拉框.按钮状态.时间赋初始值的方法,按钮的状态 如下所示: 编辑 layui.use('table', function() { var table = layui.table; //监 ...

  2. layui select日期_layui给下拉框、按钮状态、时间赋初始值的方法

    如下所示: 编辑 layui.use('table', function() { var table = layui.table; //监听行工具事件 table.on('tool(test)', f ...

  3. UE4 C++入门之路4-PostInitProperties函数详解(设置属性默认值的四种方法)

    PostInitProperties函数详解 前言 设置属性默认值的四种方法 一 声明时赋值 二 构造函数赋值 三 构造函数初始化列表 四 PostInitProperties 前言 也许在工作或者学 ...

  4. 面试题:为什么局部变量不赋初始值报错

    类加载准备阶段 类变量赋值 关键词 加载阶段>链接阶段(验证,准备,解析)>初始化阶段 在链接得准备阶段进行静态变量得默认值赋值操作 一.面试题:请回答,下面两段代码得执行结果 publi ...

  5. Android代码规范----按钮单击事件的四种写法

    [前言] 按钮少的时候用第三种的匿名内部类会比较快,比如写demo测试的时候或者登陆界面之类. 按钮多的时候一般选择第四种写法. 一.第一种写法:在XML文件中声明onClick属性(很少用) 在XM ...

  6. SWT事件的四种写法

    一.匿名内部类写法     在创建SWT中的HelloWorld插件项目中就是用的这种写法,再次复制如下: button.addSelectionListener(new SelectionAdapt ...

  7. Android点击事件(click button)的四种写法

    在学习android开发和测试的时候发现不同的人对于click事件的写法是不一样的,上网查了一下,发现有四种写法,于是想比较一下四种方法的不同 第一种方法:匿名内部类 代码: package com. ...

  8. Python中斐波那契数列的四种写法

    在这些时候,我可以附和着笑,项目经理是决不责备的.而且项目经理见了孔乙己,也每每这样问他,引人发笑.孔乙己自己知道不能和他们谈天,便只好向新人说话.有一回对我说道,"你学过数据结构吗?&qu ...

  9. 注意:C语言结构体里不能赋初始值!

    创建结构体只是开辟了一块内存空间,而不赋初始值,赋初始值有的编译器不支持的! 啥时候能赋初始值呢,c++11 可见:C++ 之设置struct 属性的默认值 C++ 11结构体内直接赋初始值

最新文章

  1. 广西卫生职业技术学院计算机考试,广西卫生职业技术学院单招2021年春招分数线...
  2. matlab解符号方程组,matlab 求解符号方程组
  3. Button的五种点击事件
  4. FTP服务器配置与管理(4) 服务器端的常用配置及FTP命令
  5. java设置窗口不可移动_Java – JDialog不可移动
  6. redis在linux搭建集群,Linux/Centos 7 redis4 集群搭建
  7. thinkpad卡在logo界面_四大系列 一个品牌,超好用的商务伴侣Thinkpad
  8. sql server 2000的数据库还原
  9. 二叉树前序中序,后序中序,公共最近祖先的实现
  10. kubernetesV1.13.1一键部署脚本(k8s自动部署脚本)
  11. C# XElement
  12. 什么是信用评分分析?
  13. mysql中怎样把字段名改为中文_mysql修改字段名-Mysql,修改
  14. STM32F103C8T6最小系统
  15. stm32采集脉冲信号_stm32用ETR采集外部脉冲个数出现二分频问题,请教哪里设置......
  16. 了解车辆驾驶行为、成功验证C-V2X技术
  17. dsp6657的helloworld例程测试-第一篇
  18. nape.geom.MarchingSquares
  19. 【智能算法】基于双隐含层BP神经网络的预测
  20. 解决微信公众号发布新的版本H5页面有缓存的问题

热门文章

  1. 北漂,2013好好混
  2. Eclipse Ctrl+ shift +o 快捷键冲突问题
  3. windows安全机制之登陆
  4. python画一个五角星
  5. C# 打印Label的两种方式及实现
  6. Python社区专访Ali Spittel
  7. 认真对待IT行业及相关培训
  8. 保质期计算器,你需要这个神器
  9. 图形界限命令在命令行输入_图形界限
  10. 高考作文,高频提及科技那些事儿……