属性分为无参属性和有参属性(即索引器)。

属性相对于字段的优点不仅仅是为了封装,还可以在读写的时候做一些额外操作,缓存某些值或者推迟创建一些内部对象,也适用于以线程安全的方式访问字段。

话说最基本的属性就不讲了,太平常了。

基本上很多文章都是讲属性的好处的,所以下面就讲一下属性的不足

属性不能作为out和ref传参。属性实质上是方法而不是字段,因为属性在编译后实际上是方法。

属性可能花较长时执行,而字段访问则是立即完成。

许多人使用属性是为了线程同步,这就可能造成线程永远终止,要线程同步就不要使用属性。

如果属性所在类可以被远程访问,那么调用属性会非常慢。

在上面这些情况下,应该优先使用方法而不是属性。

并且《CLR via C#》的作者十分不推荐使用属性,而是使用方法。

匿名类型

先上一段匿名类型的代码

var man=new {Name="Troy",Age=};

这段代码在C#编译器中会先推断Name和Age的类型,然后给他们分别创建私有字段,再然后就为这两个私有字段创建只读属性。然后就创建一个构造器初始化私有只读字段。

并重写Object的Equals(判断每个字段是否都想等),GetHashCode(根据每个字段的哈希码生成哈希码)和ToString(返回“属性=值”对的以逗号分隔的列表)。

如果编译器发现代码中定义了多个匿名类型,但是这些匿名类型的每个属性都具有相同的类型和名称以及顺序。那么实际上它只会创建一个匿名类型定义。

Tuple类型

在System命名空间中,有几个泛型Tuple(元组)类型,它们全部从Object派生,区别只在于元数的个数。

和匿名对象一样,Tuple创建好后就不可变了(所有属性都是只读)。

匿名对象的属性调用是通过具体的属性名,然而Tuple类型只能通过Item1这样的方式调用。例子如下:

        var man = new Tuple<string, int, string>("Troy", , "男");//构造器方式
var boy = Tuple.Create("Fuckboy", , "男");//静态工厂方法创造
Console.WriteLine(man.Item1);//Troy
Console.WriteLine(man.Item2);//
Console.WriteLine(man.Item3);//男
//匿名对象方式
var myObj = new { Name = "Troy", Age = , Sex = "男" };
Console.WriteLine(myObj.Name);//Troy
Console.WriteLine(myObj.Age);//
Console.WriteLine(myObj.Sex);//男
//另一种组合键值对的方式,感觉像在写js
dynamic obj = new System.Dynamic.ExpandoObject();
obj.Name = "Troy";
obj.Age = ;
obj.Sex = "男";
Console.WriteLine(obj.Name);//Troy
Console.WriteLine(obj.Age);//
Console.WriteLine(obj.Sex);//男
Console.Read();

有参属性(索引器)

C#使用数组风格的语法来公开有参属性。

CLR本身并不区分有参属性和无参属性,对它而言,每个属性都只是类型中定义的一对方法和一些元数据。而用数组风格的语法来玩有参属性是C#特有的,编译之后还是会编译成IL代码中的方法。

JIT对属性的优化

对简单的get和set访问其方法,JIT编译后会将访问其代码直接嵌入到调用属性的方法中,这样就避免了运行时发出调用所产生的开销。代价就是编译后的方法变得更大,可以想象一下调用属性的方法有很多个,那么嵌入的重复代码就有很多。

所以我们应该在属性访问器里写的代码应该尽可能少,否则用方法也不错。如果这样做了,那么JIT这样优化后,生成的本机代码会变得更小,而且执行更快。

【C#进阶系列】10 属性的更多相关文章

  1. SilkTest高级进阶系列10 – bitmap工具bitview

    SilkTest 提供了一个bitmap的工具,它可以帮助我们捕捉,比较bitmap文件.该bitmap工具的位置是~/SilkTest/bitview.exe 运行该工具后,你会发现它提供了捕捉控件 ...

  2. .Net进阶系列(10)-异步多线程综述(被替换)

    一. 综述 经过两个多个周的整理,异步多线程章节终于整理完成,如下图所示,主要从基本概念.委托的异步调用.Thread多线程.ThreadPool多线程.Task.Parallel并行计算.async ...

  3. C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)

    前言:之前的两篇封装了一些基础的表单组件,这篇继续来封装几个基于bootstrap的其他组件.和上篇不同的是,这篇的有几个组件需要某些js文件的支持. 本文原创地址:http://www.cnblog ...

  4. HTML5 进阶系列:indexedDB 数据库

    前言 在 HTML5 的本地存储中,有一种叫 indexedDB 的数据库,该数据库是一种存储在客户端本地的 NoSQL 数据库,它可以存储大量的数据.从上篇:HTML5 进阶系列:web Stora ...

  5. JS进阶系列之作用域链

    在之前写的进阶系列里面,提到了执行上下文在创建阶段,要创建变量对象.确定作用域链还有确定this的指向,本次将重点讲解一下作用域链. JavaScript代码的执行过程 在讲解作用域链之前,首先了解一 ...

  6. 【 D3.js 进阶系列 — 4.0 】 绘制箭头

    转自:http://www.ourd3js.com/wordpress/?p=660 [ D3.js 进阶系列 — 4.0 ] 绘制箭头 发表于2014/12/08 在 SVG 绘制区域中作图,在绘制 ...

  7. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  8. Bing Maps进阶系列七:Bing Maps功能导航菜单华丽的变身

    Bing Maps进阶系列七:Bing Maps功能导航菜单华丽的变身 Bing Maps Silverlight Control所提供的功能导航是非常强大的,在设计上对扩展的支持非常好,提供了许多用 ...

  9. Bing Maps进阶系列六:使用Silverlight剪切(Clip)特性实现Bing Maps的迷你小地图

    Bing Maps进阶系列六:使用Silverlight剪切(Clip)特性实现Bing Maps的迷你小地图 Bing Maps Silverlight Control虽然为我们提供了简洁.方面的开 ...

  10. Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图

    Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图 Bing Maps Silverlight Control虽然为我们提供了简洁.方便的开发模 ...

随机推荐

  1. 如何升级TeX Live 2014宏包

    转:人大经济论坛 LATEX论坛 版,详细出处参考: http://bbs.pinggu.org/forum.php?mod=viewthread&tid=3370640&page=1 ...

  2. [置顶] 开关电源的pcb设计规范

    参数设置相邻导线间距必须能满足电气安全要求 印制线的长度和宽度会影响其阻抗和感抗 尽量加粗接地线若接地线很细 按照电路的流程安排各个功能电路单元的位置 在任何开关电源设计中,pcb板的物理设计都是最后 ...

  3. JVM 参数翻译汉化解释

    博客搬家,新地址:http://www.zicheng.net/article/38.htm Behavioral Options(行为参数) Option and Default Value Des ...

  4. solr集成mmseg4j分词

    solr集成mmseg4j分词 mmseg4j https://code.google.com/p/mmseg4j/ https://github.com/chenlb/mmseg4j-solr 作者 ...

  5. notepad++插件

    html插件 https://github.com/downloads/davegb3/NppTidy2/Tidy2_0.2.zip

  6. C# barcode生成代码

    protected void Page_Load(object sender, EventArgs e) { string code = Request.Params["code" ...

  7. mac vim 使用

    再使用Mac编辑文件时感觉非常不爽,没有语法高亮,只能通过设置改变所有字体为同一个颜色,看起来还是别扭, 于是找到方法使用vim时可以实现语法高亮显示,操作步骤如下: 1.进入/usr/share/v ...

  8. [LeetCode] Longest Valid Parentheses 动态规划

    Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...

  9. Ajax请求WebService跨域问题 [转载]

    1.背景 用Jquery中Ajax方式在asp.net开发环境中WebService接口的调用 2.出现的问题 原因分析:浏览器同源策略的影响(即JavaScript或Cookie只能访问同域下的内容 ...

  10. Safari下默认10位数字为电话号码,点击拨号

    <meta content="telephone=no" name="format-detection"/>