C#:确保属性的行为与数据类似

More Effective C# 中文版
副标题: 改善C#程序的50个具体办法
[美] Bill Wagner 著,陈黎夫 译
人民邮电出版社,2010年1月第1版


More Effective C# 中文版,第3章 C#设计实践,条目26:确保属性的行为与数据类似

属性存在着两面性。从外部看上去它就像是简单的数据元素。而在内部,则以方法的形式实现。这种两面性可能会让你创建出让用户感到迷惑的属性。使用你的类型的开发者会假设其中的属性会与直接访问数据成员一样。若你的属性不符合这样的假设,那么用户则可能产生误会。属性给人的感觉应该是和直接访问数据成员一样。

若是能够正确地使用属性来描述数据成员,那么即可符合客户开发者的期待。首先,客户开发者希望相连的两次调用属性的 get 访问器将会得到同样的结果。

int someValue = someObject.ImportantProperty;
Debug.Assert(someValue == someObject.ImportantProperty);

当然,多线程环境下该假设可能不会成立──无论是使用属性还是字段。不过其他情况下,重复地访问同样一个属性理应得到同样的结果。

此外,类型的使用者也不会期待属性的访问器做很多工作。调用某个属性的 getter 不应该影响到花费很多的时间。类似地,属性的 set 访问器可能会执行一定的验证,不过也不应该太过耗时。

这个条目是非常有道理的。但是,也存在着例外:DateTime.Now 属性。这个很常用的属性显然不满足:重复地访问同样一个属性理应得到同样的结果。DateTime 类的 Now 属性是静态的,那么让我们来看看Stopwatch.Elapsed 属性吧:

01:  using System;
02:  using System.Diagnostics;
03:
04:  sealed class Test
05:  {
06:    static void Main()
07:    {
08:      Console.WriteLine("OS  Version: " + Environment.OSVersion);
09:      Console.WriteLine("CLR Version: " + Environment.Version);
10:      Console.WriteLine("IsHighResolution: " + Stopwatch.IsHighResolution);
11:      Console.WriteLine("Frequency: {0:N0}", Stopwatch.Frequency);
12:      var stopwatch = Stopwatch.StartNew();
13:      Console.WriteLine("Elapsed: " + stopwatch.Elapsed);
14:      Console.WriteLine("Elapsed: " + stopwatch.Elapsed);
15:      stopwatch.Stop();
16:    }
17:  }

该程序在 Linux 操作系统中的运行结果如下:

OS  Version: Unix 2.6.32.24
CLR Version: 2.0.50727.1433
IsHighResolution: True
Frequency: 10,000,000
Elapsed: 00:00:00.0000993
Elapsed: 00:00:00.0013385

该程序在 Windows 操作系统中的运行结果如下:

OS  Version: Microsoft Windows NT 6.0.6002 Service Pack 2
CLR Version: 4.0.30319.1
IsHighResolution: True
Frequency: 14,318,180
Elapsed: 00:00:00.0000245
Elapsed: 00:00:00.0260632

可见 Stopwatch 类的 Elapsed 属性也不满足:重复地访问同样一个属性理应得到同样的结果。

上述程序的运行环境如下所示:

版权声明:本文为博主http://www.zuiniusn.com 原创文章,未经博主允许不得转载。

时间: 2024-11-14 04:13:56

C#:确保属性的行为与数据类似的相关文章

AngularJS路由系列(5)-- UI-Router的路由约束、Resolve属性、路由附加数据、路由进入退出事件

本系列探寻AngularJS的路由机制,在WebStorm下开发.主要包括: ● UI-Router约束路由参数● UI-Router的Resolve属性● UI-Router给路由附加数据● UI-Router的onEnter和onExit事件 AngularJS路由系列包括: 1.AngularJS路由系列(1)--基本路由配置2.AngularJS路由系列(2)--刷新.查看路由,路由事件和URL格式,获取路由参数,路由的Resolve3.AngularJS路由系列(3)-- UI-Rou

EasyUI queryParams属性 在请求远程数据同时给action方法传参

http://www.cnblogs.com/iack/p/3530500.html?utm_source=tuicool EasyUI queryParams属性 在请求远程数据同时给action方法传参 属性名 属性值类型 描述 默认值 queryParams object 在请求远程数据的时候发送额外的参数. 代码示例: $('#dg').datagrid({ queryParams: { name: 'easyui', subject: 'datagrid' } }); {} Actio

Highcharts属性与Y轴数据值刻度显示Y轴最小最大值

Highcharts 官网:https://www.hcharts.cn/demo/highcharts Highcharts API文档:https://api.hcharts.cn/highcharts#yAxis.tickmarkPlacement Highcharts属性与Y轴数据值刻度显示Y轴最小最大值 Highcharts.setOptions({global:{useUTC : false}}); $(function(){ //声明报表对象 var chart = new Hig

03-对JQuery对象的属性,特性以及数据的操作

对JQuery对象的属性,特性以及数据的操作: 特性(attributes)和属性(properties): 特性的值是字符串. 属性的值不光为字符串,而且可以为布尔值,对象,数字. 元素的属性和特性有动态链接,如果特性在dom对象中存在,其中一个发生变化,另一个也会变化 如果特性是本来就在dom对象中存在,但是类型为boolean,那么特性和属性将不会同步. 如果attributes不是dom对象内建的属性,attributes和properties的值不会同步. 操作元素的特性: 获取特性的

基于CSS3新属性Animation及transform实现类似翻书效果

注:本实例JS部分均以原生JS编写,不善用原生JS的,可用jQuery等对三方框架改写 先上效果图:(样式有点丑,可以忽略一下下,效果出来了就好,后期加到其他项目中方便更改0.0) 类似翻书效果,原本的意思是使用JS来控制的,点击一次之后使用setInterval去控制书页翻过去的动画,当书页翻转180°之后,清除掉setInterval,但当我连续点击,那之前没有翻转180°的书页将无法继续完成之前的动作,可以用清除setInterval的方式,但总感觉动画效果不好,当然还有其他解决办法,但突

C# 控制datagridview的combox属性的列绑定数据

//datagridvie列绑定list的数据 List<User> listChange = GetChange();//查询数据库内容,保存到list this.datagridview1.AutoGenerateColumns = false;//禁止生成不需要的列 this.datagridview1.DataSource = listChange;//list的内容绑定到datagridview Gender.DataSource = listChange;//list的内容绑定到d

根据访问属性进行差异化数据加载

判断用户是否第一次访问页面,先不说怎么做,想想什么场景下会用到? 如果我们页面的体积过大,用户第一次访问,会消耗大量的时间(2-5s)去下载页面所需要的资源,给用户带来的体验是很不好的,尤其是移动端的用户.如果我们可以在用户第一次访问的时候只加载主要内容,在这个主要内容中引导用户做更多的加载资源的操作,一方面可以让用户熟悉系统,一方面也给页面加载资源争取了巨量的时间,何乐而不为?! 我们能最快想到的方案是,使用 cookie ,服务器根据 cookie 的属性(如某个 Tag 的值为 1 或者

1122 django属性操作orm字段数据操作

目录 1. 静态文件的配置 手动静态文件的访问资源 静态文件的动态绑定 2.request方法 2.1 请求方式 2.2 获取前端的请求方式 request.method 2.3 request方法 request.method request.POST request.GET .get方法 3. pycharm连接MySQL 4. django连接MySQL数据库 4.1.配置文件配置 4.2.指定使用的数据库连接模块 5.django orm简介 5.1 基本概念 1. orm对象关系映射

java:Hibernate框架(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态)

1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件  准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configurati