第五章 类 (2)

来源:互联网 责任编辑:栏目编辑 发表时间:2013-07-01 06:29 点击:
5.3  类属性
    有两种途径揭示类的命名属性——通过域成员或者通过属性。前者是作为具有公共访问性的成员变量而被实现的;后者并不直接回应存储位置,只是通过 存取标志(accessors)被访问。
    当你想读出或写入属性的值时,存取标志限定了被实现的语句。用于读出属性的值的存取标志记为关键字get,而要修改属性的值的读写符标志记为set。
在你对该理论一知半解以前,请看一下清单5.9中的例子,属性SquareFeet被标上了get和set的存取标志。
清单 5.9  实现属性存取标志

1: using System;
2:
3: public class House
4: {
5:  private int m_nSqFeet;
6:
7:  public int SquareFeet
8:  {
9:   get { return m_nSqFeet; }
10:   set { m_nSqFeet = value; }
11:  }
12: }
13:
14: class TestApp
15: {
16:  public static void Main()
17:  {
18:   House myHouse = new House();
19:   myHouse.SquareFeet = 250;
20:   Console.WriteLine(myHouse.SquareFeet);
21:  }
22: }

    House类有一个命名为SquareFeet的属性,它可以被读和写。实际的值存储在一个可以从类内部访问的变量中——如果
你想当作一个域成员重写它,你所要做的就是忽略存取标志而把变量重新定义为:
public int SquareFeet;
对于一个如此简单的变量,这样不错。但是,如果你想要隐藏类内部存储结构的细节时,就应该采用存取标志。在这种情
况下,set 存取标志给值参数中的属性传递新值。(可以改名,见第10行。)
除了能够隐藏实现细节外,你还可自由地限定各种操作:
get和set:允许对属性进行读写访问。
get only:只允许读属性的值。
set only:只允许写属性的值。
除此之外,你可以获得实现在set标志中有效代码的机会。例如,由于种种原因(或根本没有原因),你就能够拒绝一个新
值。最好是没有人告诉你它是一个动态属性——当你第一次请求它后,它会保存下来,故要尽可能地推迟资源分配。

5.4   索引
   你想过象访问数组那样使用索引访问类吗 ?使用C#的索引功能,对它的期待便可了结。

语法基本上象这样:
属性   修饰符  声明 { 声明内容}

具体的例子为
public string this[int nIndex]
{
get { ... }
set { ... }
}

索引返回或按给出的index设置字符串。它没有属性,但使用了public修饰符。声明部分由类型string和this 组成用于表
示类的索引。
get和set的执行规则和属性的规则相同。(你不能取消其中一个。) 只存在一个差别,那就是:你几乎可以任意定义大括
弧中的参数。限制为,必须至少规定一个参数,允许ref  和out  修饰符。
this关键字确保一个解释。索引没有用户定义的名字,this 表示默认接口的索引。如果类实现了多个接口,你可以增加更
多个由InterfaceName.this说明的索引。

  为了演示一个索引的使用,我创建了一个小型的类,它能够解析一个主机名为IP地址——或一个IP地址列表(以
http://www.microsoft.com为例 )。这个列表通过索引可以访问,你可以看一下清单5.10 的具体实现。

清单  5.10  通过一个索引获取一个IP地址

1: using System;
2: using System.Net;
3:
4: class ResolveDNS
5: {
6:  IPAddress[] m_arrIPs;
7:
8:  public void Resolve(string strHost)
9:  {
10:   IPHostEntry iphe = DNS.GetHostByName(strHost);
11:   m_arrIPs = iphe.AddressList;
12:  }
13:
14:  public IPAddress this[int nIndex]
15:  {
16:   get
17:   {
18:    return m_arrIPs[nIndex];
19:   }
20:  }
21:
22:  public int Count
23:  {
24:   get { return m_arrIPs.Length; }
25:  }
26: }
27:
28: class DNSResolverApp
29: {
30:  public static void Main()
31:  {
32:  
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • 用C#制作屏幕捕获程序
  • .NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上
  • 遍历ArrayList易犯错误
  • C#对XML操作:一个处理XML文件的类(1)
  • .NET简谈反射(动态调用)
  • 使用C#编写LED样式时钟控件
  • DataList嵌套问题 如何删除内层子DataList的记录
  • 怎样用C#实现完整文档打印功能
  • .NET简谈自定义事务资源管理器
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1