“暴露”阶段:值->行为(函数)->行为(函数)的参数;打个比方,这就好象“穿得越多,而暴露得就越少”。语言亦是如此。
属性之所以在体系中具有重要意义,是因为它可以承担类与类关联的消息人角色。
我们知道,低耦合的重要手段之一便是封装,那么在C#的语言概念到达更高的层次之前,对于C#两大类型之一的值类型,必须进行处理,而其中首当其冲的便是变量。对变量进行封装的重要手段,便是属性--属性的本质是系统封装的变量。
[MSDN C#2.0]
1.字段
字段作为类成员直接存在于类定义中,而在函数中定义的叫变量。
(1)在.net事件模型中的发生时刻,处在调用对象实例的构建子(constructor)之前。所以如果构建子存在对字段赋值的行为,那么它将覆盖字段声明期间给定的任何值。
(2)字段可选地(optionally)能够被声明为static,这使得该字段无须实例化便对任何调用者(caller)可得(available)。
(3)如果字段的访问子(accessor)被定义为readonly,则它只能在初始化时或通过构建子赋值,其它的赋值都将是非法的。
(4)static readonly 字段和常数(constant)类似,只不过C# 编译器不能在编译时访问它的值,而在运行时才可以。
2.属性
提供了某环境(问题域)中对字段访问的遮断能力:它继承于C++和Java使用的访问子概念,结合了字段字义和访问子(getter/setter方法),故又称之为聪明字段(smart fields)。属性,可以看作对数据的封装。
// Address class example using standard accessors保守的方式:访问子 class Address { protected string City; protected string ZipCode; public string GetZipCode() { return this.ZipCode; } public void SetZipCode(string ZipCode) { // Validate ZipCode against some data store. this.ZipCode = ZipCode; // Update this.City based on validated ZIP code. } }
(1)属性的一个特点是可携带访问器-即,读取由getter处理,写入由setter处理;
(2)具有getter和setter的属性,那么称该属性是可读写(read-write)的;自然,没有setter,该属性就是只读的(read-only);只有setter,称为只写的(write-only);
(3)set访问子在进行属性写入时,用默认关键字value取得写入值;
(4)属性名与其封装的变量名未必有名字关联。如age变量或Age属性,只是看起来方便而已;
//在C#中使用新的方式:属性 using System; class Address { protected string city; public string City { get { return city; } } protected string zipCode; public string ZipCode { get { return zipCode; } set { zipCode = value; city = "Atlanta"; } } } class PropertyApp { public static void Main() { Address addr = new Address(); addr.ZipCode = "30338"; string zip = addr.ZipCode; Console.WriteLine("The city for ZIP code {0} is {1}", addr.ZipCode, addr.City); } }
从下图(msil)中,我们可以清楚地看到,C#中的属性来自.net系统自动地为访问子增加了两个方法,分别是get_属性名或set_属性名:
注意:
(1)对于属性,getter和setter必有其一;
(2)属性不能用作函数的参数;
3.属性用于接口
public interface ISampleInterface { // Property declaration: string Name { get; set; } }
接口属性的访问器不具有体。它只是用来,指示属性是否为--读写、只读或只写。
小结:
从另一个角度(pattern) 来看,属性又是语言(具体是C#)对IoC(控制反转)的一次应用,即访问者不需知道它如何实现,只需要知道那里存在这么一个物件-那个'东西'叫属性!
通过这种手段,我们得到了初始化后置的功效(-a good thing),属性的这种功能特征,叫做“惰性初始化”(lazy initialization)-更适合初始化非常耗费计算资源的问题域。
还是那句话:“在需要的时候再初始化”!--属性不愧为很棒的语言级接口(interface)机制。
发表评论
-
ZT,一篇好文
2010-05-03 10:33 1020读读语言大牛们(其中有位是Anders)这篇文章,会很受益。( ... -
关于“匿名方法”与“lambda操作符”的实现
2010-03-24 22:29 896在<关于“回调”的实现>一文中,我们探讨了使用委托 ... -
effective hierarchy(二)之 函数合辑(2)
2009-09-16 21:29 743介绍: 本节我们来看看另外一种封装,构建件。构建件作为 ... -
effective hierarchy(一)之 基本概念(8)
2009-07-02 23:39 698MSDN,C#2 一、语句 1.结束点和可达性(en ... -
effective hierarchy(一)之 基本概念结束篇
2009-06-30 15:41 688一、函数/功能成员(fun ... -
effective hierarchy(一)之 基本概念(7)
2009-06-23 21:15 960以下可跳过: [立记保留:到现在为止,我满意的是认真的精神。 ... -
effective hierarchy(一)之 基本概念(6)
2009-06-21 00:34 990MSDN,C#2.0 转换(conversions) ... -
effective hierarchy(一)之 基本概念(5)
2009-06-18 22:16 732MSDN,C#2.0 变量基本点: 变量代表 ... -
effective hierarchy(一)之 基本概念(4)
2009-06-15 15:59 752MSDN,C#2.0: 一、名字空间和类型名称(nam ... -
effective hierarchy(一)之 基本概念(3)
2009-06-14 15:00 765MSDN,C#2.0: 一、签 ... -
effective hierarchy(一)之 基本概念(2)
2009-06-13 18:22 852MSDN:基本概念 一、 ... -
effective hierarchy(一) 之基本概念(1)
2009-06-11 09:37 793我告诫自己,不要忽略简单的东西,又要扎实。所以这一篇开始,专门 ... -
effective hierarchy(一)之 属性与索引器
2009-06-07 14:07 1183编程笺言:“优良的设计 ... -
effective hierarchy(一)之 从array说起(4)
2009-06-07 00:53 833回顾:上一节中,我们 ... -
effective hierarchy(一)之 从array说起(3)
2009-06-06 21:20 715回顾: 从上一节中,可以看出枚举的易用性对数组使用的启示意义 ... -
effective hierarchy(一)之 从array说起(2)
2009-06-06 09:34 717复习: 从上一节,可 ... -
effective hierarchy(一)之 从array说起(1)
2009-05-29 13:59 910MSDN(c#2.0): 数组的元义是 ... -
effective hierarchy(一)之 C#中的new
2009-05-27 23:21 866MSDN(c#2.0): 在msdn中,指出new的三种用法。 ...
相关推荐
Data Integrator的转换类型包括Address Enhancement、Case、Date Generation、Effective Date、Hierarchy Flattening、History Preserving、Key Generation、Map CDC Operation、Map Operation、Match Merge、Merge...
正如C++之父Bjarne Stroustrup所说:“C++确实已经变得过于‘专家友好’。”这里的“专家友好”指的是对于深入理解语言特性和习惯用法的专业程序员而言,C++变得更为友好和高效。本书《更多C++惯用法》旨在帮助那些...
Qt 采用http通信json解析读取天气
岗位晋升360度调查表.doc
合法辞退员工的N种方式.pptx
大模型、Agent、具身智能及人形机器人学习全路径规划.pdf
华润万家员工手册.doc
招聘需求分析.xls
内容概要:本文详细介绍了基于‘光伏(PV)+蓄电池+负载’架构的双有源桥DC-DC变换器仿真方法及其在Matlab 2021b中的具体实现。首先解析了光伏系统的MPPT控制,通过扰动观察法使光伏板始终处于最大功率点。接着讨论了蓄电池的恒流充放电控制,利用PI控制器确保电池的安全和高效运作。然后阐述了双有源桥DC-DC变换器的闭环控制机制,借助PID控制器维持系统输出电压的稳定性。最后,文章展示了如何在Matlab Simulink环境下构建完整的仿真模型,涵盖各模块间的电气连接与信号交互,为新能源系统的优化提供了理论和技术支持。 适合人群:从事电力电子、新能源系统设计的研究人员和工程师,尤其是那些需要深入了解光伏储能系统工作原理的人群。 使用场景及目标:适用于希望掌握光伏储能系统中关键组件如MPPT、恒流充放电控制及双有源桥DC-DC变换器的设计与仿真的技术人员。目标是在实际工程项目中提高系统的效率和可靠性。 其他说明:文中提供的代码片段和建模思路有助于读者更好地理解和实践相关技术,同时也强调了一些常见的陷阱和调试技巧,帮助避免潜在的问题。
线性代数
内容概要:本文详细介绍了不同类型电机的调速方法,重点探讨了直流电机双闭环调速、永磁同步电机电流滞环闭环调速以及异步电机滞环电流调速。文中不仅提供了每种调速方法的基本原理和技术特点,还附带了相应的代码示例进行辅助解释。此外,文章对永磁同步电机的电流滞环调速与SVPWM调速进行了对比,指出了各自的优劣之处。最后,强调了在实际应用中选择合适调速方案的重要性。 适合人群:从事电机控制系统设计与开发的技术人员,尤其是有一定电机控制基础的研发人员。 使用场景及目标:适用于需要深入了解电机调速机制及其应用场景的专业人士。目标是帮助读者掌握不同电机调速方法的特点,以便在实际工程中做出最优选择。 其他说明:文章通过具体的代码实例展示了调速方法的实际应用,使读者能够更好地理解和实践相关技术。同时提醒读者在实际调试过程中要注意参数设置和硬件条件的影响。
人员晋升推荐表.xls
员工生日关怀方案
内容概要:本文详细介绍了对国际知名大厂的三个逆向ADC电路(SAR ADC、Sigma-Delta ADC和Pipeline ADC)进行深入剖析。作者通过Cadence Virtuoso平台研究了这些电路的标准单元库设计,探讨了各个电路的关键技术和实现细节。对于24bit Sigma-Delta ADC,重点讨论了其调制器部分的时钟相位分配和噪声整形技术;对于16bit SAR ADC,则关注其比较器阵列的独特设计以及动态锁存比较器的应用;而对于14bit Pipeline ADC,着重分析了其级间放大器设计和电荷共享技术。此外,文中还提到了在将这些设计适配到自家工艺过程中遇到的问题及其解决方案,如电容寄生效应、时序约束调整、运放结构优化等。 适合人群:从事模拟集成电路设计的专业人士,尤其是对ADC设计感兴趣的工程师和技术研究人员。 使用场景及目标:帮助读者深入了解高精度ADC的工作原理和设计技巧,掌握逆向工程技术在实际项目中的应用,提高对不同工艺节点下ADC设计的理解和适应能力。 其他说明:文中提供了大量具体的代码片段和仿真命令,便于读者理解和实践。同时,作者分享了许多宝贵的经验教训,强调了在逆向工程中需要注意的技术细节和潜在风险。
内容概要:本文详细介绍了大型立体仓库智能物流系统的构建与优化。该项目涉及一万多个库位、一百多台输送机和八台堆垛机,采用了西门子PLC作为控制核心,通过无线网桥与WCS和WMS系统对接。文章重点讲解了梯形图编程和功能块的应用,如输送机启停控制、堆垛机移动控制、路径规划、无线通讯处理以及异常处理机制。此外,还探讨了设备协同、逻辑优化、任务分配算法和速度曲线规划等方面的技术细节。 适合人群:从事工业自动化、智能仓储系统设计与开发的工程师和技术爱好者。 使用场景及目标:适用于智能仓储系统的设计、实施和维护,旨在提高系统的稳定性、效率和可维护性。 其他说明:文中提供了大量实际项目中的代码示例和调试经验,有助于读者理解和应用相关技术。
新员工月工作总结表.xlsx
内容概要:本文详细介绍了基于西门子S7-1500 PLC的汽车电子零件装配线集成解决方案。主要内容涵盖伺服轴控制、阿特拉斯拧紧枪控制、康耐视视觉检测系统以及HMI界面的设计与实现。文中展示了如何利用SCL语言将多种工业设备(如HMI、伺服电机、六轴机器人等)的功能封装为标准化功能块,从而提高系统的模块化程度和可复用性。同时,还分享了一些实际项目中的调试经验和优化技巧,如通过调整加减速曲线避免机械振动、设置扭矩保持时间和视觉检测的防抖定时器等。 适合人群:从事自动化控制领域的工程师和技术人员,尤其是熟悉PLC编程和工业自动化设备集成的专业人士。 使用场景及目标:适用于汽车制造行业的生产线控制系统设计与实施。主要目标是帮助工程师快速掌握如何使用SCL语言构建高效稳定的PLC控制系统,提升生产效率和产品质量。 其他说明:文中不仅提供了详细的代码示例,还结合具体的应用场景进行了深入剖析,有助于读者更好地理解和应用相关技术。此外,强调了模块化编程的优势,如减少重复劳动、便于维护升级等。
内容概要:本文详细介绍了如何在STM32、AT32和GD32等Cortex-M系列MCU上实现串口IAP(In Application Programming)Bootloader,支持远程升级及RS485升级。主要内容涵盖Bootloader的工作原理、内存分配、通信协议设计、Flash写入操作以及跳转应用程序的关键步骤。文中提供了具体的代码示例,如Bootloader主循环、RS485收发控制、Flash写入、CRC校验等,并分享了多个实战经验和注意事项,确保数据传输的可靠性。 适合人群:从事嵌入式系统开发的技术人员,尤其是对STM32、AT32、GD32等国产MCU有一定了解并希望掌握串口IAP技术的研发人员。 使用场景及目标:适用于需要远程升级固件的嵌入式项目,帮助开发者避免现场升级带来的不便,提高设备维护效率。目标是让读者能够独立实现一个可靠的串口IAP Bootloader,掌握RS485通信和Flash编程的关键技术。 其他说明:文中提到的代码和配置已在GitHub上提供,方便读者下载和实践。同时,作者分享了许多实战经验和常见问题解决方案,有助于减少开发过程中可能出现的问题。
线性代数
学生会干部竞选清心简约.pptx