日期:2009-04-20  浏览次数:20350 次

八.类 
对于面向对象语言来说,类是重头戏,C#中类的使用和C++中类似,在细节方面有些差别. 
首先来看一个C#的类的例子: 
例: 

class myclass:mybasicclass   //注意基类不需要写限定符 
    { 
        private int a; 
        public int num() 
         { 
             return 0; 
         } 
    } 
public class mybasicclass 
    { 
    } 
这里写出了一个类的限定符public,C#还有的限定符: 
internal:只能在当前工程中使用,当class前缺省限制符时就默认为此限制符 
public:可以在任何工程中使用 
abstract (抽象的):类不能实例化,只能继承,可以有抽象成员 
sealed (密封的):不能继承 
关键字能够相互组合. 
首先需要知道一点,C#中只能有一个基类,它不支持多重继承,同时不允许派生类的可访问性比其基类更高,也就是说:内部类可以继承于公共类,反之不行,在前文也已经说过,object类是C#中最高的类,如果一个类没有基类,它就隐式的继承了object类,在类中都可以使用object提供的方法. 
也许你还记得在C++中,类里面定义的方法的具体实现是在类的外部实现的,但在C#中已经不允许,C#规定所有的代码都必须在类中,所以方法的代码就只能和C++中的内联函数的格式一样,但是切记,C#中的这样写法并不意味着是内联的,在C#中已经取消了内联函数的定义,.net会在编译的时候自动确定是否内联. 
从上面的例子中还能发现一个不同点就算是:在类定义结束的时候没有了分号; 
从现在开始,从细节上阐述C#的不同用法: 
1.       在C++的名词成员变量,在C#中称为字段,字段在C++中不能初始化,但在C#中可以直接初始化, 
2.       构造函数,它于C++使用相似,但是不允许在其中给字段初始化,C#还添加了一种静态构造函数 
public class mybasicclass 
    { 
        static mybasicclass() 
        { 
        } 
    } 
    它不需要限定符,它的作用是在程序运行是对静态变量进行赋值 
3.     析构函数:它和C++的概念已经完全不同了,因为C#内部有了内存自动收集机,能够对不用的内存进行回收,所以不需要在析构函数中释放内存了.也就无需析构函数,但是析构函数在派生于接口的类中函数有作用的,接口的概念后面会讲到 
4.     虚拟函数:C#的虚拟函数同C++在语法上有区别,但是含义还是一样的.C#中基类的虚拟函数使用关键字virtual 在派生类中使用override 
5.     运算符重载:C#中运算符重载和C++原理基本相同,但存在一些区别,区别在于有些运算符C#已经不允许重载了.不能重载的运算符有:-= , += , /= ,*= ,%=, 按位赋值运算符(&= ……) , 布尔运算符(&&……),赋值运算符(=).同时在C#中还有一个硬性的规定,比如重载了运算符> 就必须重载>= ,重载了== ,就必须重载 !=  反之毅然,当然不止这些还有< <= 等等 

九.异常 
C#和C++的异常基本相同: 
C#的异常语句: 
try 


    catch 


    finally 


它们的不同点最主要的就是,不管是否抛出异常,最后的finally块一定马上执行. 

十.不安全代码 
什么是不安全代码,前面我已经说过,使用指针就是不安全代码,在C#中是可以使用指针的,而且它和C++的格式一样,但是必须放在不安全代码段中. 
声名不安全代码段,使用关键字unsafe . 
例 
public unsafe int num() 

    return 0; 

不安全代码可以是方法,类,结构 
十一.接口 
在C++中是没有接口这个概念的.它是有COM演变而来.一个C#接口只是函数和属性的定义.就好比一个抽象类.它的定义和类采用相似的语法.使用关键字interface 
类对接口的实现是通过派生来实现的,对于接口,类可以多重继承. 

后记. 
到这里我就准备停笔了,也许你会发现类以后的内容变的简单了,不详实了,的确这于我刚开始的初衷有些背离,但这也是有原因的.首先就是我在写第三篇的时候发现在<<C#高级编程>>一书的附录部分已经有了C++程序员过渡C#的内容,而且比较详细,大家可以参看此书,我只是把里面大家经常会用到的语法进行了阐述,对于一些不常用到,大家可以通过专门的C#书籍进行详细的了解.第二.在类之后的内容有许多讲的都是C++不具备的内容,这些内容的讲解也无法和C++进行比较来讲,所以也没有什么捷径,只能看C#的专业书籍进行学习,比如接口,委托,甚至类中的一些用法,还有我没有提到的属性,事件.通过此文学习可以在对C#一窍不通的情况下快速通过已学知识对其有所了解和掌握,但是一门语言是博大精深的,所以学习C#在此基础上还需要看一下经典的教程,对其有一个完全明了的深入理解,同时因为C#是建立在.net环境之下,所以对.NET的机制也需要有一定的认识,最后我希望对C#有兴趣的朋友都能完美的掌握其精华,在.net的划时代历程上走出辉煌的一步.