属性赋初始值的四种写法--C#6.0新特性
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新特性相关推荐
- layui select日期_layui给下拉框、按钮状态、时间赋初始值的方法,按钮的状态
layui给下拉框.按钮状态.时间赋初始值的方法,按钮的状态 如下所示: 编辑 layui.use('table', function() { var table = layui.table; //监 ...
- layui select日期_layui给下拉框、按钮状态、时间赋初始值的方法
如下所示: 编辑 layui.use('table', function() { var table = layui.table; //监听行工具事件 table.on('tool(test)', f ...
- UE4 C++入门之路4-PostInitProperties函数详解(设置属性默认值的四种方法)
PostInitProperties函数详解 前言 设置属性默认值的四种方法 一 声明时赋值 二 构造函数赋值 三 构造函数初始化列表 四 PostInitProperties 前言 也许在工作或者学 ...
- 面试题:为什么局部变量不赋初始值报错
类加载准备阶段 类变量赋值 关键词 加载阶段>链接阶段(验证,准备,解析)>初始化阶段 在链接得准备阶段进行静态变量得默认值赋值操作 一.面试题:请回答,下面两段代码得执行结果 publi ...
- Android代码规范----按钮单击事件的四种写法
[前言] 按钮少的时候用第三种的匿名内部类会比较快,比如写demo测试的时候或者登陆界面之类. 按钮多的时候一般选择第四种写法. 一.第一种写法:在XML文件中声明onClick属性(很少用) 在XM ...
- SWT事件的四种写法
一.匿名内部类写法 在创建SWT中的HelloWorld插件项目中就是用的这种写法,再次复制如下: button.addSelectionListener(new SelectionAdapt ...
- Android点击事件(click button)的四种写法
在学习android开发和测试的时候发现不同的人对于click事件的写法是不一样的,上网查了一下,发现有四种写法,于是想比较一下四种方法的不同 第一种方法:匿名内部类 代码: package com. ...
- Python中斐波那契数列的四种写法
在这些时候,我可以附和着笑,项目经理是决不责备的.而且项目经理见了孔乙己,也每每这样问他,引人发笑.孔乙己自己知道不能和他们谈天,便只好向新人说话.有一回对我说道,"你学过数据结构吗?&qu ...
- 注意:C语言结构体里不能赋初始值!
创建结构体只是开辟了一块内存空间,而不赋初始值,赋初始值有的编译器不支持的! 啥时候能赋初始值呢,c++11 可见:C++ 之设置struct 属性的默认值 C++ 11结构体内直接赋初始值
最新文章
- 广西卫生职业技术学院计算机考试,广西卫生职业技术学院单招2021年春招分数线...
- matlab解符号方程组,matlab 求解符号方程组
- Button的五种点击事件
- FTP服务器配置与管理(4) 服务器端的常用配置及FTP命令
- java设置窗口不可移动_Java – JDialog不可移动
- redis在linux搭建集群,Linux/Centos 7 redis4 集群搭建
- thinkpad卡在logo界面_四大系列 一个品牌,超好用的商务伴侣Thinkpad
- sql server 2000的数据库还原
- 二叉树前序中序,后序中序,公共最近祖先的实现
- kubernetesV1.13.1一键部署脚本(k8s自动部署脚本)
- C# XElement
- 什么是信用评分分析?
- mysql中怎样把字段名改为中文_mysql修改字段名-Mysql,修改
- STM32F103C8T6最小系统
- stm32采集脉冲信号_stm32用ETR采集外部脉冲个数出现二分频问题,请教哪里设置......
- 了解车辆驾驶行为、成功验证C-V2X技术
- dsp6657的helloworld例程测试-第一篇
- nape.geom.MarchingSquares
- 【智能算法】基于双隐含层BP神经网络的预测
- 解决微信公众号发布新的版本H5页面有缓存的问题