现在的位置: 首页 > 综合 > 正文

我是如何学习c#语言的,勤奋才是王道 第三部分 OOP

2013年04月06日 ⁄ 综合 ⁄ 共 4178字 ⁄ 字号 评论关闭
类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类
第三部分 OOP技术
类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类类
一构造函数与析构函数
编译器声明缺省构造函数 
?       你可以声明缺省构造函数
?       如果你声明构造函数,那么编译器不会声明构造函数
ealed class Pair 
   public Pair(int x, int y) 
   { 
        this.x = x; //这个表示 当我们创建一个对象(实例)的时候,
  //this就代表我们创建的当前对象
        y = y; 
    }  
  构造函数的参数y用字段y来赋值。
编译器通过的原因是字段y已经被赋初值。
其实,如果没有对字段y进行初始化,编译器仍然会通过,
困为字段y已有缺省值0,所以在构造函数中没有显式初始化字段y是不会发生错误的。
二接口
三继承
四多态
 第一 通过重载来实现
 第二 通过虚拟方法+继承来实现
       定义一个基类,里面只是大体的描述事物,
方法定义为虚拟的(vitual)。相当于一个总体框架
在需要的时候我们可以派生很多不同功能
的派生类,对基类的被声明为虚拟的方法 覆盖(overridden) 
每一个派生类都可以使用相同的函数名
这样多个派生类便实现了多态
注意:如果要重写 覆盖 虚拟方法 必须在派生类中用关键字override
第三 抽象类(专门为 派生或继承 服务的)
我们可以定一个抽象类,专门用于继承 多态,只对抽象类做最基础的描述
例如抽象类 动物  只定义一些所有动物都有的一些属性和方法
抽象类必须对类名和方法都使用关键字abstract
因为抽象类是专门为继承 或派生 服务的, 所以不要将其生命为sealed(密封)
        密封类和普通类一样,只是不能被派生或继承
密封类(sealed)的数据成员不能声明为protected
五异常处理
1
异常处理可以提供一个良好的与用户交互的能力
如果不用异常处理 当用户输入错误的时候将会出现一个
晦涩难懂的错误提示 并终止程序
例如
using System;
class 1
{
public static void Main()
  {
int[] myArray = new int[5];
try
 {
  for(int ctr = 0;ctr<10; ctr++)
            {
     myArray[ctr] = ctr;
    }
  }
  catch
    {
     Console.WreteLine("输入错误了,快点检查一下吧");
    }
}
}
当发生异常的时候,程序会立刻跳到catch语句,而不是报错并停止程序
下面是一个巧用异常的情况
计算z= 根号下[(x的平方-y的平方)的绝对值] + x
flort x,y,z;
try
  {
    z = Math.Sqrt(x*x-y*y);
  }
catch
   {
     z=Math.Sqrt(y*y-x*x);
   }
finally
             {
     z=z+x;
    }
   用户只需要输入x y的值,这是一种求绝对值得方法
第二个catch语句配合达到取绝对值的目的
 
上面的程序只是用catch捕获异常,还可以在catch中包含参数来确定引发的是那种异常
catch (System.Excption e){}
使用这种方法,系统会采用默认设置好的一些异常处理
Excption是系统预定义的处理异常的一个类
这里e是一个Exception类型的变量
这里e代表一些信息 至于是什么信息 我们不能自己定义
由系统自己寻找,并输出相应的信息
using System;
class 1
{
public static void Main()
  {
int[] myArray = new int[5];
try
 {
  for(int ctr = 0;ctr<10; ctr++)
            {
     myArray[ctr] = ctr;
    }
  }
  catch (System.Excption e)
    {
     Console.WreteLine("输入错误了,快点检查一下吧:\n{0}", e);
    }
}
}
2
finally
不管try语句是否成功执行,都会执行finally语句,如果有的话
3
公共异常类
C# 中的异常用于处理系统级和应用程序级的错误状态,它是一种结构化的、统一的和类型安全的处理机制。
C# 中的异常机制非常类似于 C++ 的异常机制,但是有一些重要的区别:
  在 C# 中,所有的异常必须由从 System.Exception 派生的类类型的实例来表示。
在 C++ 中,可以使用任何类型的任何值表示异常。
在 C# 中,利用 finally 块(第 8.10 节)可编写在正常执行和异常情况下都将执行的终止代码。
在 C++ 中,很难在不重复代码的情况下编写这样的代码。
在 C# 中,系统级的异常如溢出、被零除和 null 等都对应地定义了与其匹配的异常类,并且与应用程序级的错误状态处于同等地位。 
System.ArithmeticException
在算术运算期间发生的异常
(如 System.DivideByZeroException 和 System.OverflowException)的基类。
System.ArrayTypeMismatchException
当存储一个数组时,如果由于被存储的元素的实际类型与数组的实际类型不兼容而导致存储失败,
就会引发此异常。
System.DivideByZeroException
在试图用零除整数值时引发。
System.IndexOutOfRangeException
在试图使用小于零或超出数组界限的下标索引数组时引发。
System.InvalidCastException
当从基类型或接口到派生类型的显式转换在运行时失败时,
就会引发此异常。
System.NullReferenceException
在需要使用引用对象的场合,如果使用 null 引用,就会引发此异常。
System.OutOfMemoryException
在分配内存(通过 new)的尝试失败时引发。
System.OverflowException
在 checked 上下文中的算术运算溢出时引发。
System.StackOverflowException
当执行堆栈由于保存了太多挂起的方法调用而耗尽时,
就会引发此异常;这通常表明存在非常深或无限的递归。
System.TypeInitializationException
在静态构造函数引发异常并且没有可以捕捉到它的 catch 子句时引发。
  4
多个catch语句,系统会按照顺序执行,我们可以把自定义的一些
专用异常程序放在前面,如果处理失败,可以在最后放一个通用的
异常处理语句
两个catch语句的顺序很重要 前面只能放具体的处理
后面放较通用的异常,不可改变顺序
如果发生了数组下标溢出错误会输出
专用于处理数组下表溢出的系统异常
//这里没有输出e的信息
第二个catch处理是综合的,是为了防止其他错误
如果没有出现溢出错误,而出现其他错误,比如除数为零
则系统不会执行第一个catch语句,而执行的二个catch语句
输出结果
输入错误了,快点检查一下吧:
System.DivideByZeroException:Attempted to divide by zero//这个是系统自己定义的输出信息
第二种方法throw
using System;
class 1
{
public static void Main()
    {
int[] myArray = new int[5];
        Console.WriteLine("...");
.....//相关程序
if()
{
throw(new DividByZeroException() );
}
   }
        }
                不要忘记new 关键字 ,吧上面格式记住
而且throw语句一般与if结合使用
5自定义异常
六 Object 基类
c#中所有的类都是从Object派生而来,它是.NET 框架类层次结构的根类
任何东西都是Object
Object由两个方法,GetType  ToString
前者返回 一个对象(实例)de数据类型
后者返回一个表示当前对象的名字(字符串)
任何对象都可以使用这两个方法
我们甚至可以把一个常量pi声明为类
using System;
sealed class PI
{
 public static float nbr;
 
 static public float val()
{
return(nbr);
}
static PI()
   {
 nbr = 3.1415926F;
}
}
class 1
{
  public static void Main()
  {
Object x = new PI();
Console.WriteLine("Tostring:{0}" ,    x.Tostring());
Console.WriteLine("Type:{0}"     ,    x.GetType());
Console.WriteLine("Tostring :{0}",  123.Tostring());
Console.WriteLine("Type:{0}"     ,  123.Gettype());
输出结果:
tostring: PI
Type:PI
ToString:123
Type:System.Int32
因为Object是所有类的基类 所以可以定一个Object类型的变量
并将其指向PI类
x的类型是PI 
对x使用ToString之后得到的是PI
后面两句分析:
因为c#中所有的东西都是对象,都是由Object 派生而来的
123这些数字也不例外
  }
}
七装箱与拆箱(boxing unboxing)
在六中,我们说,所有的东西都是由Object派生而来的,
c#中的一切都是对象,这样说不是很准确,应该是 都可以看做是对象
前面的123 其实 是吧字面数值 隐式转换成 对象了
装箱概念:把值类型转换成引用类型(对象)
拆箱概念:把引用类型显示的转换成值类型
      装箱会在我们用的时候系统会自动完成
       拆箱必须是显示
       被拆箱的值必须存储到相应的数据类型变量中
八is as 关键字

抱歉!评论已关闭.