八.类
对于面向对象语言来说,类是重头戏,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的划时代历程上走出辉煌的一步.