知识大全 .NET中的特殊类型成员

Posted 类型

篇首语:不飞则已,一飞冲天;不鸣则已,一鸣惊人。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 .NET中的特殊类型成员相关的知识,希望对你有一定的参考价值。

.NET中的特殊类型成员  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  本文我们将考察类型能定义的某些特殊成员 在大力简化处理类型及其对象实例需要的语法方面 这些类型有助于面向对象设计

  类型构造器

  你已经熟悉了什么是构造器 它负责对象实例状态的初始化 除了实例构造器以外 Microsoft(r) NET公共语言运行时(CLR)还支持类型构造器(也叫做静态构造器 类构造器或类型初始化) 类型构造器可被应用到接口 类和数值类型 它允许任何在类型中声明的成员被访问之前实现必要的初始化 类型构造器不需要参数并且总是返回void类型 类型构造器只访问类型的静态字段并且其通常的目的是初始化这些字段 在类型的任何实例被创建之前以及类型的任何静态字段或方法被引用之前 必须要保证已经运行了类型构造器

  许多语言(包括C#)在定义类型时都自动产生类型构造器 但是某些语言需要显式(手工)实现类型构造器

  为了理解类型构造器 让我们研究一下列在C#中定义的类型

  class Atype

  static int x =

  

  在建立这个代码时 编译器自动地为产生Atype类型构造器 这个构造器负责初始化静态字段x为值 如果你使用ILDasm 很容易认出类型构造器方法 因为它们的名字都是 cctor(对于类构造器而言)

  在C#中 通过在类型中定义静态构造器方法 你可以自己实现类型构造器 关键字static的使用意味着这时类型构造器 而不是实例构造器 下面是一个非常简单的例子

  class AType

  static int x

  static AType()

  x =

  

  

  这个类型定义与前面的相同 注意类型构造器决不能试图创建自己的类型实例 而且构造器也不能引用类型的非静态成员

  最后 如果你用C#编译器编译下列代码 它产生单独的类型构造器方法

  class AType

  static int x =

  static AType()

  x =

  

  

  这个构造器首先初始化x= 然后 初始化x= 换句话说 编译器产生的结果类型构造器首先包含静态字段的初始化代码 随后是类型构造器的代码

  属性

  许多类型定义的属性可以被重新获得或修改 这些属性常常都是用类型字段成员来实现的 例如 下面是包含有两个字段的类型定义

  class Employee

  public String Name

  public Int Age

  

  如果创建这个类型的实例 那么很容易用以下代码得到或设置属性

  Employee e = new Employee()

  e Name = Jeffrey Richter // 设置名字属性

  e Age = // 设置年龄属性

  Console WriteLine(e Name) // 显示 Jeffrey Richter

  用这种方式使用属性非常普通 但以我的观点看 上述代码不会向列出的那样被实现 面向对象设计和编程的立约之一便是数据抽象 它的意思就时类型字段不能用公共字段暴露出来 因为它太容易被修改 太容易让人写出不恰当地使用这个字段的代码 从而破坏对象的状态 例如 某人很容易编写下面的代码破坏Employee对象

  e Age = //人的年龄怎么会是 呢?

  所以说 在设计类型时 我强烈建议所有字段都是私有的(private)或至少是受保护的(protected)——决不要公共的(public) 然后 让使用类型的人能Get或Set属性 专门为此提供方法 打包对字段的访问的方法就叫做存取器(或访问器方法)方法 这些方法能随时实现完整性检查并保证对象的状态不被破坏 例如 我重写了前面定义过的Employee类 代码如图一 虽然这是一个简单的例子 但你能从中明白抽象数据字段的巨大好处 你还能从中明白如何轻松实现只读属性 或者仅仅通过不去实现某个存取器方法来轻松达到只写属性

  显示的数据抽象方法有两个缺点 第一 因为要实现附加的函数 所以要多写一些代码 第二 类型的使用者现在必须要调用方法而不是仅仅引用单个的字段名

  e SetAge( ) // Updates the age

  e SetAge( ) // Throws an exception

  我想 所有的人都会同意这些缺点与其优点比起来显得微不足道 但运行时仍然提供了一种属性机制 多少使得第一个缺点容易忍受了 并且完全消除了第二个缺点

  类使用了属性 其功能和上面所示的类相同 正如你所看到的 属性简化了一些代码 但更重要的是允许调用这项下面一样写自己的代码

   Age = // 更新年龄

  e Age = // 掷出异常Throws an exception

  Get属性存取器的返回值和传递到Set属性存取器参数值类型相同 Set属性存取器的返回值是void 而Get属性存取器没有入口参数 属性可以是静态的 虚拟的 抽象的 内部的 私有的 保护的或公共的 另外 属性可以在接口中定义 关于这一点将在后面讨论

  我还应该指出属性不必于字段关联 例如 类型System IO FileStream定义了一个长度属性 它返回流中的字节数 当长度属性的Get方法被调用时 这个长度不是由字段提供 而是调用另一个函数请求底层操作系统返回打开文件流的字节数

  当你创建属性时 编译器实际上发出专门的get_ProName和/或set_ProName存取器方法(这里ProName是属性名) 大多数编译器会理解这些专用方法并允许开发人员存取这些有专门属性语法的方法 但是 遵守公共语言运行时规范的编译器不需要完全支持属性 只要支持专用存取方法调用即可

  另外 对于完全支持属性的编译器来说 在定义和使用属性时使用的语法稍有不同 例如带受管扩展的C++需要使用_property关键字

  索引属性

  某些类型 如System Collections SortedList暴露逻辑元素列表 为了能轻松存取这种类型中的元素 可以定义一个索引属性(也叫索引器 indexer) 一个索引属性的例子 其索引器的的使用极其简单

  BitArray ba = new BitArray( )

  for (int x = x < x++)

  // 置所有偶数位为 on

  ba[x] = (x % == )

  Console WriteLine( Bit + x + is + (ba[x] ? On Off ))

  

  BitArray例子中 索引器带一个Int 参数 bitPosition 索引器必须至少带一个参数 参数个数可以是两个或更多 这些参数(以及返回类型)可以是任何类型 创建以String作为参数的索引器查找联合数组中的值是十分普通的事情 一种类型可以提供多个索引器 只要其原型不同

  就像set属性 set索引器存取方法包含一个隐藏的参数 值 当存取方法被调用时 它表示想得到一个新的值 BitArray的set存取方法显示了这个参数值的使用

  一个设计良好的索引器应该具备get和set两个存取方法 即便你能只实现get存取方法(对于只读语义)或者只实现set存取方法(对于只写语义) 建议你的索引器实现两个存取器 理由很简单 索引的使用者不希望只有半个行为 例如 当编写下面两行代码时 使用者不想看到编译器出错

  String s = SomeObj[ ] // 如果有存取器 编译 OK

  SomeObj[ ] = s //如果没有存取器 编译出错

  索引器总是起类型实例的作用 并且不能被声明为静态 但它可以是公共的 私有的 保护的或内部的

  当你创建索引属性时 编译器实际上会发布专门的get_Item和/或set_Item存取器方法 大多数编译器都会理解这些专门的方法并且会允许开发人员利用专门的索引属性语法存取这些方法 但是 与CLS(公共语言系统)兼容的编译器不需要完全支持索引属性 只要编译器支持专用存取器调用即可

  同样 对于完全支持索引属性的编译器在定义和使用这些属性的时候 需要的语法稍有差别 例如 C++受管扩展需要使用_property关键字

  结论

cha138/Article/program/net/201311/13534

相关参考

知识大全 .NET中的特殊类型成员[1]

.NET中的特殊类型成员[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文我们将考察类型

知识大全 .NET中的特殊类型成员[3]

.NET中的特殊类型成员[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  索引属性  某些类

知识大全 C# .Net中的类型转换

C#.Net中的类型转换  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  装箱拆箱还是别名  许多

知识大全 C# .Net中的类型之间的转换

C#.Net中的类型之间的转换  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    装箱拆箱还是别

知识大全 论.net命名规范

  用Pascal规则来命名方法和类型(笔者注:单词首字母大写)  >  用Camel规则来命名局部变量和方法的参数(笔者注:首单词小写其余单词首字母大写笔者使用此方式命名成员变量)    >  所有

知识大全 构造和析构成员函数

    类有一个特殊的成员函数叫做构造成员函数它通常用于初始化类的数据成员在创建对象时会自动调用类的构造成员函数Java中的构造成员函数必须与该类具有相同的名字另外构造成员函数一般都应用public类

知识大全 ASP.NET入门教程 4.2.3 成员关系[2]

ASP.NET入门教程4.2.3成员关系[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 ASP.NET入门教程 4.2.3 成员关系[1]

ASP.NET入门教程4.2.3成员关系[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 C#类型成员样式

C#类型成员样式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  静态成员  

经济一体化可以分为各种类型,其中的一种类型是__,在这种类型下,各成员国只是相互免征关税,以保证商品在各成员国之间

经济一体化可以分为各种类型,其中的一种类型是_____,在这种类型下,各成员国只是相互免征关税,以保证商品在各成员国之间的自由流动。A、经济联盟B、共同市场C、自由贸易区D、关税同盟答案:C解析:根据