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

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

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

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

属性不能作为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. App 卸载记录

    http://blog.csdn.net/jiangwei0910410003/article/details/36427963 总结:没有root权限的情况下,还是使用Intent发送卸载请求,同时 ...

  2. c++算法应用 预备

    章 C + +程序设计 大家好!现在我们将要开始一个穿越" 数据结构.算法和程序" 这个抽象世界的特殊旅程,以解决现实生活中的许多难题.在程序开发过程中通常需要做到如下两点:一是高 ...

  3. win8 IIS

    IIS打开页面报500错误 aspnet_regiis.exe -i 报 “此操作系统版本不支持此选项” 决解方法: 控制面板 - 程序和功能 - 启动或关闭windows功能 - Internet ...

  4. C primer plus 练习题 第七章

    1. #include <stdio.h> #define SPACE ' ' #define NEWLINE '\n' int main() { int spaces,newlines, ...

  5. Log4net对文件的支持

    RollingFileAppender循环记录日志(指定文件最大长度) <appender name="RollingFileAppender" type="log ...

  6. ext 3.x 让uploadPanel支持swfupload

    经常做系统的时候会遇到上传组件,特别是大文件的时候总是很郁闷,长时间无响应导致糟糕的用户体验,所以决定采用swfupload来支持文件上传. 大体代码如下. var upload = {}; uplo ...

  7. 【转】Linux 概念架构的理解

    转:http://mp.weixin.qq.com/s?__biz=MzA3NDcyMTQyNQ==&mid=400583492&idx=1&sn=3b18c463dcc451 ...

  8. Android UI开发第四十篇——ScrollTricks介绍

    ScrollTricks是一个开源控件,实现了两个简单功能: 1.Quick Return:向上滑动时,View也向上滑动并且消失,当向下滑动时,View马上出现.例如Google Now的搜索功能. ...

  9. 【软件分析与挖掘】Multiple kernel ensemble learning for software defect prediction

    摘要: 利用软件中的历史缺陷数据来建立分类器,进行软件缺陷的检测. 多核学习(Multiple kernel learning):把历史缺陷数据映射到高维特征空间,使得数据能够更好地表达: 集成学习( ...

  10. codeforce No to Palindromes!(枚举)

    /* 题意:给定一个字符串中没有任何长度>1的回文子串!求按照字典序的该串的下一个字符串 也不包含长度>1的任何回文子串! 思路:从最低位进行枚举,保证第i位 不与 第 i-1位和第 i- ...