C#语法糖之第一篇:自动属性&隐式类型
今天给大家分享一下C#语法糖的简单的两个知识点吧。
自动属性:在 C# 4.0 和更高版本中,当属性的访问器中不需要其他逻辑时,自动实现的属性可使属性声明更加简洁。 客户端代码还可通过这些属性创建对象。 get and set accessors." id="mt3">如下面的示例所示声明属性时,编译器将创建一个私有的匿名支持字段,该字段只能通过属性的 get 和 set 访问器进行访问。
我们C#4.0以前的传统方式的属性是用来封装字段的,这里我简单的对比一下这两种方式的不同及关联关系吧:
public class AutoProperty
{
//传统方式定义属性必须先定义字段来封装
private string name;
public string Name
{
get { return name; }
set { value = name; }
}
//自动属性
public string LoginName { get; set; }
}
从代码的字数上看传统方式的写法比较繁琐,自动属性一行代码即可实现,然后到底这两个功能上有什么区别呢,这里我用反编译工具来看了一下(反编译工具用的是.Net Reflector 8.3),具体效果如下:
虽然我们在写代码是没有写字段,但是编译器帮我们自动生成字段,然后在每个属性的get和set访问器在看一下会发现
//传统方式
public void set_Name(string value)
{
value = this.name;
} public string get_Name()
{
return this.name;
}
//自动属性
[CompilerGenerated]
public void set_LoginName(string value)
{
this.<LoginName>k__BackingField = value;
} [CompilerGenerated]
public string get_LoginName()
{
return this.<LoginName>k__BackingField;
}
使用自动属性注意的地方:从上面代码上可以看出来访问器格式基本差不多,就是自动属性访问器上标记为编译器生成,然后字段也是编译器生成的字段。所以传统方式和自动属性对于编译去来说效果是一样的,只不过这些繁琐的操作编译器帮我们生成了,以减少程序员写的代码和让代码的逻辑很清晰,很简短。
1、 对于自动实现的属性,需要 get 和 set 访问器。 要使该类不可变,请将 set 访问器声明为 private。 set accessor, you cannot use an object initializer to initialize the property." id="mt5">但是,声明私有 set 访问器时,不能使用对象初始值来初始化属性。 必须使用构造函数或工厂方法。
public string CustomerId { get; private set; }
public AutoProperty(string _CustomerId)
{
this.CustomerId = _CustomerId;
}
隐式类型:可 以赋予局部变量推断“类型”var 而不是显式类型。 var 关键字指示编译器根据初始化语句右侧的表达式推断变量的类型。 推断类型可以是内置类型、匿名类型、用户定义类型或 .NET Framework 类库中定义的类型,这是微软MSDN给出的定义,其实隐式类型简单的理解就是程序员在声明变量可以不用指定类型,由编译器根据值来指定类型。2、 如果需要在属性中有复杂的业务逻辑的话还得用传统的属性来实现,不管什么东西都有它的利与弊,只要我们适当的利用即可。
理论就说怎么多,下面咱们直接帖代码:
public static void Test()
{
//传统方式定义变量
string CustomerId = "客户";
var NewCustomerId = "隐式类型";
var Age = 20;
var Array = new string[] {"111","222"};
object objectstring = "object";
Console.WriteLine("传统类型:"+CustomerId+" "+"隐式类型"+NewCustomerId);
}
从上面代码看出来只有第一个变量是显示定义变量,有的人看到这儿就会说这样直接定义Object不就行了,这个有什么好处啊,这个我刚开始也很纳闷,后来我还是用反编译工具查看了一下,在这里我直接贴图吧:
从上面贴图可以看出来,隐式类型通过编译器后会根据右侧的数值自动推断类型,但是object类型通过编译器后还是object类型,所以这样会出现装箱拆箱操作,但是隐式类型没有装箱和拆箱操作,所以从性能上来时隐式类型是比object类型好。
使用隐式类型注意事项:
1、.必须在定义时初始化
2、一旦初始化完成,就不能再给变量赋与初始值不同类型的值了
3、var要求是局部变量
文章原文来自:
C#语法糖之第一篇:自动属性&隐式类型的更多相关文章
- C#语法糖系列 —— 第一篇:聊聊 params 参数底层玩法
首先说说为什么要写这个系列,大概有两点原因. 这种文章阅读量确实高... 对 IL 和 汇编代码 的学习巩固 所以就决定写一下这个系列,如果大家能从中有所收获,那就更好啦! 一:params 应用层玩 ...
- .NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器
开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...
- C#语法糖之第二篇: 参数默认值和命名参数 对象初始化器与集合初始化器
今天继续写上一篇文章C#4.0语法糖之第二篇,在开始今天的文章之前感谢各位园友的支持,通过昨天写的文章,今天有很多园友们也提出了文章中的一些不足,再次感谢这些关心我的园友,在以后些文章的过程中不断的完 ...
- c#4.5新语法--自动属性和隐式类型
1.自动属性 自动属性是c#中属性定义的两种形式的一种:传统属性定义.自动属性. 1.1 传统属性定义 private int _age; public int ...
- Linq之隐式类型、自动属性、初始化器、匿名类
目录 写在前面 系列文章 隐式类型 自动属性 初始化器 匿名类 总结 写在前面 上篇文章是本系列的小插曲,也是在项目中遇到,觉得有必要总结一下,就顺手写在了博客中,也希望能帮到一些朋友.本文将继续介绍 ...
- C#3.0新特性:隐式类型、扩展方法、自动实现属性,对象/集合初始值设定、匿名类型、Lambda,Linq,表达式树、可选参数与命名参数
一.隐式类型var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,编译器自动推断类型. 1.var类型的局部变量必须赋予初始值,包括匿名 ...
- C#中的自动属性、隐式类型var、对象初始化器与集合初始化器、扩展方法
1.自动属性(Auto-Implemented Properties) //以前的写法 .net2.0 private string _userName; public string UserName ...
- C#的隐式类型、匿名类型、自动属性、初始化器
1.隐式类型 1)源起 在隐式类型出现之前,我们声明一个变量时,需要为它指定相应的类型,甚至在foreach一个集合的时候,也要为遍历的集合元素,指定变量的类型,隐式类型出现后,程序员就不用再做这个工 ...
- 深入理解DOM节点类型第一篇——12种DOM节点类型概述
× 目录 [1]元素 [2]特性 [3]文本[4]CDATA[5]实体引用[6]实体名称[7]处理指令[8]注释[9]文档[10]文档类型[11]文档片段[12]DTD 前面的话 DOM是javasc ...
随机推荐
- Java日志性能
在任何系统中,日志都是非常重要的组成部分,它是反映系统运行情况的重要依据,也是排查问题时的必要线索.绝大多数人都认可日志的重要性,但是又有多少人仔细想过该怎么打日志,日志对性能的影响究竟有多大呢?今天 ...
- Illustrator软件中eps和ai格式的区别
转自Illustrator软件中eps和ai格式的区别 AI是ILL特有的格式,EPS格式是在排版领域经常使用的格式.AI中的位图图像是用链接的方式存储,EPS格式则将位图图像包含于文件中.对于含有相 ...
- JSP页面间传递参数的5种方法
JSP页面间传递参数是经常需要使用到的功能,有时还需要多个JSP页面间传递参数.下面介绍一下实现的方法. (1)直接在URL请求后添加 如:< a href="thexuan.jsp? ...
- 查看SGA和PGA使用率
select name,total,round(total-free,2) used, round(free,2) free,round((total-free)/total*100,2) pctus ...
- poj3294
首先后缀数组预处理然后二分答案len很显然,然后考虑怎么判定我们用左右指针顺着名次扫描一下,初始左右指针为1根据LCP(i,j)=min(height[rank[i]+1]~height[rank[j ...
- ☀【HTML5】Modernizr
Modernizr 使用Modernizr探测HTML5/CSS3新特性
- 游戏开发设计模式之状态模式 & 有限状态机 & c#委托事件(unity3d 示例实现)
命令模式:游戏开发设计模式之命令模式(unity3d 示例实现) 对象池模式:游戏开发设计模式之对象池模式(unity3d 示例实现) 原型模式:游戏开发设计模式之原型模式 & unity3d ...
- Java同步
同步:★★★★★ 好处:解决了线程安全问题. 弊端:相对降低性能,因为判断锁需要消耗资源,产生了死锁. 定义同步是有前提的: 1,必须要有两个或者两个以上的线程,才需要同步. 2,多个线程必须保证使用 ...
- HDOJ(HDU) 4847 Wow! Such Doge!(doge字符统计)
Problem Description Chen, Adrian (November 7, 2013). "Doge Is An Ac- tually Good Internet Meme. ...
- C++获取本机IP地址
对网络库简单的封装了一下,以后自己使用的时候方便了很多 #include <WinSock2.h> #pragma comment(lib,"ws2_32") //链接 ...