特别的 .NET 类型成员A

上传人:飞*** 文档编号:40818510 上传时间:2018-05-27 格式:DOC 页数:5 大小:36.50KB
返回 下载 相关 举报
特别的 .NET 类型成员A_第1页
第1页 / 共5页
特别的 .NET 类型成员A_第2页
第2页 / 共5页
特别的 .NET 类型成员A_第3页
第3页 / 共5页
特别的 .NET 类型成员A_第4页
第4页 / 共5页
特别的 .NET 类型成员A_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《特别的 .NET 类型成员A》由会员分享,可在线阅读,更多相关《特别的 .NET 类型成员A(5页珍藏版)》请在金锄头文库上搜索。

1、本页内容 类型构造函数 属性 索引属性 小结 类型构造函数 您应该很熟悉构造函数,它负责设置对象实例的初始状态。除了实例构造函数,Microsoft .NET 公共语 言运行库(common language runtime,CLR)还支持类型构造函数(也称为静态构造函数、类构造函数、 或者类型初始函数) 。类型构造函数可以用于接口、类和值类型。它允许类型 在任何成员被访问前进行所 需的初始化工作。类型构造函数不接受任何参数,返回类型必须是 void。类型构造函数仅访问类型的静态 字段,并且其通常的用途是初始化这些字段。类型构造函数确保在类型的任何实例创建前,以及在类型的 任何静态字段或 者方

2、法被引用前运行。 许多语言(包括 C#)自动为任何定义的类型产生类型构造函数。但是,有些语言需要显式实现类型构造 函数。 为了理解类型构造函数,查看下面的类型(用 C# 定义): class AType static int x = 5; 在生成该段代码时,编译器自动为 AType 产生一个类型构造函数。该构造函数负责将静态字段 x 的值初 始化为 5。如果使用 ILDasm,可以很容易地发现类型构造函数方法,因为它们的名字是 .cctor(即 class constructor) 。 在 C# 中,您可以在类型中定义一个静态的构造函数方法来亲自实现类型构造函数。使用 static 关键字让

3、该构造函数成为一个类型构造函数而不是实例构造函数。下面是一个很简单的例子: class AType static int x;static AType() x = 5; 该类型定义与前面的相同。注意,类型构造函数永远不能试图创建其自身类型的实例,并且构造函数不能 引用任何此类型的非静态成员。 最后,对于以下代码,C# 编译器只产生一个类型构造函数方法。 class AType static int x = 5;static AType() x = 10; 该构造函数首先将 x 初始化为 5,然后将 x 初始化为 10。换句话说,编译器最终产生的类型构造函数 首先包含静态字段的初始化代码,然后才

4、是类型构造函数方法中的代码。 返回页首 属性许多类型定义可进行检索或者改变的属性。通常来说,这些属性被实现为类型的字段成员。例如,下面是 一个包含两个字段的类型定义: class Employee public String Name;public Int32 Age; 如果创建该类型的一个实例,就能够轻松获取或设置以下属性,如下所示: Employee e = new Employee(); e.Name = “Jeffrey Richter“; / Set the Name attribute e.Age = 36; / Set the Age attribute Console.Writ

5、eLine(e.Name); / Displays “Jeffrey Richter“ 以这种方式对属性进行操作很常见。但是,我认为,上面的代码根本无法实现。面向对象设计和开发的一 大特点 是数据抽象。数据抽象意味着类型字段永远不应该被公开,因为太容易编写出不恰当使用字段的 代码,破坏对象的状态。例如,很容易写出以下代码来破坏一个 Employee 对象。 e.Age = -5; / How could someone be -5 years old? 因此,当设计类型时,强烈建议将所有的字段设为私有,或者至少受保护 永远不要设为公共。这样, 要让某类型的用户获取或者设置属性,公开专门用于此目

6、的的方法。将对字段的访问封装起来的方法通常 称为访问器方法 (accessor)。它们可以进行完整的检查(可选),保证对象的状态不会被破坏。例如,我会重 写前面所示的 Employee 类,以模仿 HYPERLINK “http:/ l “fig1“图 1 中的代码。这是一个简单的 例子,但是可以看到抽象数据字段的巨大好处,也可以看到使属性只读或只写是多么容易,无需实现某种 访问器方法。 Figure 1 Abstracting Data Fields class Employee private String Name; / field is now private private Int3

7、2 Age; / field is now private public String GetName() return(Name); public void SetName(String value) Name = value; public Int32 GetAge() return(Age); public void SetAge(Int32 value) if (value 0“); byteArray = new Byte(numBits + 7) / 8; public Boolean thisInt32 bitPosition get if (bitPosition byteAr

8、ray.Length * 8 - 1) throw new IndexOutOfRangeException(); return(byteArraybitPosition / 8 if (value) byteArraybitPosition / 8 = (Byte) (byteArraybitPosition / 8 | (1 (bitPosition % 8); else byteArraybitPosition / 8 = (Byte) (byteArraybitPosition / 8 图 3 BitArray ba = new BitArray(14); for (int x = 0

9、; x 14; x+) / Turn all even numbered bits onbax = (x % 2 = 0);Console.WriteLine(“Bit “ + x + “ is “ + (bax ? “On“ : “Off“); 在图 3 所示的 BitArray 示例中,索引器有一个 Int32 的参数:bitPosition。所有索引器必须至少有一个 参数,而且可能有两个或者更多的参数。这些参数(和返回类型)可以是任意类型。常见的情况是,创建 一个将 String 作为参数的索引器,用于在一个关联数组中查找值。类型可以提供多个重载的索引器,只 要它们的原型不同。 象设置属

10、性一样,设置索引器访问器方法包含一个隐含的参数 value,它表示访问器被调用时新的期望值。BitArray 设置访问器显示这个使用的 value 参数。 一个设计良好的索引器应该同时具有 get 和 set 访问器。尽管您可以只实现 get 访问器(用于只读语义) 或只实现 set 访问器(用于只写语义) ,建议索引器还是实现两个访问器。原因很简单,使用索引的用户 不会希望只有一半的行为可用。例如,用户不希望在编写下面两行代码时出现编译器错误: String s = SomeObj5; / Compiles OK if get accessor exists SomeObj5 = s; /

11、Compiler error if set accessor doesnt exist 索引器总是作用在特定的类型实例上,并且不能声明为静态的。但是索引器可以被标记为公有、私有、保 护或者内部。 当创建一个索引器属性时,编译器实际上产生特殊的 get_item 和/或 set_item 访问器方法。大多数编译器 会理解这些特殊的方法,从而允许开发人员使用特殊的索引属性语法访问这些方法。但是,不需要遵循 CLS 的编译器完全支持索引器属性;编译器只需要支持调用特殊的访问器方法。 而且,完全支持索引属性的编译器可能需要稍微不同的语法来定义和使用这些属性。例如,托管扩展的 C+需要使用 _property 关键字。 返回页首 小结 本专栏讨论的概念对所有 .NET 程序员而言都非常重要。我提到的特殊类型的成员使组件成为公用语言运 行库中最好的元素,即现代的组件旨在支持属性。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 资格认证/考试 > 其它考试类文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号