您现在的位置:网络学院 > 开发教室 > 跟我学.net
总体了解C#(2 属性)

出处:PConline
责任编辑:zwg

[02-5-20 17:57] 作者:荣耀翻译/ASPCool.com


总体了解C#(2 属性)

A Comparative Overview of C#中文版

作者:Ben Albahari
公司:Genamics
日期:2000年7月31日初版,2000年8月10日修订。
感谢以下人士支持和反馈(按字母先后顺序):Don Box、 C.R. Manning、 Joe Nalewabau、 John Osborn、 Thomas Rhode & Daryl Richter。
译者:荣耀

2.属性

对于Delphi和Visual Basic的用户来说,属性是个熟悉的概念。使用属性的目的是将获取器/设置器[译注:原文为getter/setter]的概念正式化,这是一个被广泛使用的模式,尤其是在RAD(快速应用开发)工具里。

以下是你可能在Java或C++里写的典型代码:

foo.setSize (getSize () + 1);

label.getFont().setBold (true);


同样代码在C#里可能会变成:

foo.size++;

label.font.bold = true;


C#代码对于使用foo和label的用户来说更直观、更可读。在实现属性方面,差不多同样简单:

Java/C++:

public int getSize()

{

return size;

}

public void setSize (int value)

{

size = value;

}

C#:

public int Size

{

get {return size;}

set {size = value;}

}


特别是对于可读写的属性,C#提供了一个处理此概念的更清爽的方式。在C#中,get和set方法是内在的,而在Java和C++里则需人为维护。C#的处理方式有诸多优点。它鼓励程序员按照属性的方式去思考—把这个属性标为可读写的和只读的哪个更自然?或者根本不应该为属性?如果你想改变你的属性的名称,你只要检查一处就可以了(我曾看到过中间隔了几百行代码的获取器和设置器【译注:此处是指C++(Java)里对同一个数据成员/字段(一般来说是)的获取器和设置器】)。注释也只要一处就可以了,这也避免了彼此同步的问题。IDE【译注:集成开发环境】是可以帮助做这个事的(事实上,我建议他们这么做【译注:此处的“他们”应该是指微软有关人员】),但应该牢记编程上的一个基本原理—尽力做好模拟我们问题空间的抽象。一个支持属性的语言将有助于获得更好的抽象。

【作者注:关于属性的这个优点的一个反对意见认为:当采用这种语法时,你搞不清是在操纵一个字段还是属性。然而,在Java(当然也包括C#)中,几乎所有真正复杂一点的类都不会有public的字段。字段一般都只具有尽可能小的访问级别(private/protected,或语言所定义的缺省的),并且只通过获取器和设置器方法暴露,这也意味着你可以获得优美的语法。让IDE解析代码也是完全可行的,可用不同的颜色高亮显示属性,或提供代码完成信息以表明它是否是一个属性。我们还应该看到,如果一个类设计良好,这个类的用户将只关心该类的接口(或规范)【译注:此处是指该类向其客户公开(不单单是public,对其派生类来说,也可能是protected)的方法、属性(C++/Java无显式属性概念)等,这里的客户包括其派生类等等】,而不是其内部实现。另外一个可能的争论是属性不够有效率。事实上,好的编译器可以内联仅返回某个字段的获取器,这和直接访问字段一样快。说到底,即使使用字段要比获取器/设置器来的有效,使用属性还有如下好处—日后可以改变属性的字段【译注:是指可以改变获取器/设置器的实现代码部分,比如改变获取器/设置器里所操作的字段,也可以在获取器/设置器里做一些校验或修饰工作等】,而不会影响依赖于该属性的代码】



相关文章:

运用C#制作屏幕捕捉程序(3)
运用C#制作屏幕捕捉程序(4)
运用C#制作屏幕捕捉程序(目录)
C#的多线程机制初探(1)
C#的多线程机制初探(2)
C#的多线程机制初探(3)
C#的多线程机制初探(4)
用设计模式固化你的C#程序(1)
用设计模式固化你的C#程序(2)
用设计模式固化你的C#程序(3)


内容搜索 
高级搜索

本栏今日焦点