c#面向对象编程(二)

时间:2021-08-29 17:25:43
  一、装箱与拆箱
      装箱转换允许将“值类型”隐式转换为“引用类型”。存在下列装箱转换:
◆从任何“值类型”(包括任何“枚举类型”)到类型object。
◆从任何“值类型”(包括任何“枚举类型”)到类型System.ValueType。
◆从任何“值类型”到“值类型”实现的任何“接口类型”。
◆从任何“枚举类型”到System.Enum类型。
将“值类型”的值装箱的操作包括:分配一个对象实例并将“值类型”的值复制到该实例中。
int i = 123;
object box = i;
        拆箱也称为取消装箱转换。取消装箱转换允许将引用类型显式转换为值类型。一个取消装箱操作包括以下两个步骤:首先检查对象实例是否为给定值类型的一个装了箱的值,然后将该值从实例中复制出来。
为使到给定值类型的取消装箱转换在运行时取得成功,源操作数的值必须是对某个对象的引用,而该对象先前是通过将该值类型的某个值装箱而创建的。
object box = 123;
int i = (int)box;
二、结构和接口
      结构与类有很多相似之处:结构可以实现接口,并且可以具有与类相同的成员类型。然而,结构在几个重要方面不同于类:结构为值类型而不是引用类型,并且结构不支持继承。结构的值存储在“在堆栈上”或“内联”。
当向方法传递结构时,将传递该结构的副本,而传递类实例时,将传递一个引用。
对于结构,不像类那样存在继承。一个结构不能从另一个结构或类继承,而且不能作为一个类的基。但是结构可实现接口,而且实现方式与类实现接口的方式完全相同。
     接口可以包含方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现。接口只指定实现该接口的类或接口必须提供的成员。
三、集合与索引器
      集合基本上是由一群相同类型的对象所组成的。利用集合,可以使用相同的语法,一次处理多个对象。.NET对于集合的支持,集中于System.Collection命名空间里的一组集合接口以及实现这些接口的派生类;例如,Stack类实现ICollection接口并且提供后进先出(last-in first-out)的数据结构集合对象,Hashtable类则实现Idictionary接口,为一应用散列算法,提供高效率搜索索引键值得字典型键值数据集合;这些不同的类与接口,定义了实现集合所需的功能。
      了解.NET对于集合所提供的支持,首先必须从IEnumerable以及IEnumerator这两个接口开始进行说明,其提供了从集合中,存取元素对象的基础功能,定义列举集合内所含元素的相关方法。所有的集合类,均会继承IEnumerable这个接口,这样做让集合对象能够支持foreach语法,支持在集合中利用循环,一一浏览列举其中元素的功能;Ienumerator由IEnumerable接口所定义的GetEnumerator方法所取得,其定义了存取集合元素所需的相关方法。
索引器(indexer)使得可以像数组那样对对象使用下标。已为我们提供了通过索引方式方便地访问类的数据信息的方法。
      索引器的声明格式:
      [修饰符]    数据类型    this [int index] {访问函数体代码}
class IndexStud
{     private string[] sname;
      public IndexStud()//构造函数
      {    
         sname=new string[]{"Smith","Rose","Mary","Robot","Hamlat"};
      }
     public string this[int index]
     {      
        get{return sname[index];}
        set{sname[index]=value;}
     }

IndexStud stud=new IndexStud();
Console.Write("{0}",stud[0]);
四、异常处理
      在C# 里,异常处理就是C# 为处理错误情况提供的一种机制。它为每种错误情况提供了定制的处理方式,并且把标识错误的代码与处理错误的代码分离开来。
      对.NET类来说,一般的异常类System.Exception派生于System.Object。还有许多定义好的异常类(如:System.SystemException、System.ApplicationException等),他们又派生于System.Exception类。其中System.ApplicationException类是第三方定义的异常类,如果我们要自定义异常类,那么就应派生于它。
      在代码中对异常进行处理,一般要使用三个代码块:
◆Try 块的代码是程序中可能出现错误的操作部分。
◆Catch 块的代码是用来处理各种错误的部分(可以有多个)。必须正确排列捕获异常的catch子句,范围小的Exception放在前面的catch。即如果Exception之间存在继承关系,就应把子类的Exception放在前面的catch子句中。
◆Finally 块的代码用来清理资源或执行要在try块末尾执行的其他操作(可以省略)。且无论是否产生异常,Finally块都会执行。