分类: C#/.net
2014-07-01 20:16:24
1、 New操作符功能
1) 作为运算符,创建对象、调用构造函数。
对于值类型使用New操作时,执行的是赋初值操作,对于类来说,需要完成分配内存和初始化两个步骤。值类型分配于线程的堆栈(stack)上,其变量本身就保存其实值,因此也不受GC的控制,;而引用类型变量,包含了指向托管堆的引用,内存分配于托管堆(managed heap)上,内存收集由GC完成。
2) 作为修饰符,用于隐藏继承中基类的成员。类似于VB中的shadow修饰符。
3) 作为约束,用于在泛型中可能用作类型参数的参数的类型。
注意:new作为约束和其他约束共存时,必须在最后指定。其定义方式为:
class Genericer
{
public T GetItem()
{
return new T();
}
}
实现方式:
class MyCls
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
public MyCls()
{
_name = "Emma";
}
}
class MyGenericTester
{
public static void Main(string[] args)
{
Genericer
Console.WriteLine(MyGen.GetItem().Name);
}
}
简言之,使用override重写基类方法,通过父类引用一样只能看到子类的方法,使用New重写基类方法,父类子类各自引用对应方法。不能重写非虚方法和静态方法。
在子类中New父类中的方法,父类中的方法不一定是虚类型,在子类中override父类中的方法,父类中的方法一定得是虚类型。
2、 Abstract修饰符
Abstract方法一定要被override,只有当类是abstract的时候,才可以声明abstract方法;因为抽象方法没有实现,因此子类必须override,不能New;
3、 Sealed关键字
Sealed关键字必须与override连用,也就是说实现sealed方法的类的父类必须实现了此方法,该关键字有两个作用(密封类不能被继承;密封方法重写基类中的方法,但其本身不能在派生类中进一步重写)
4、 Internal关键字
类似于VB中的friend。
5、 使用括号进行强制类型转换或者使用as关键字实现同样功能,但两者实现机制不同,前者生成的IL指令是castclass,后者则是isinst,如果转换失败,前者则在运行时抛出异常,后者则是简单的返回一个null值。VB中使用Ctype或者trycast、directcast
6、 值类型
C#要求必须对值类型变量初始化才能使用,VB则自动添加调用构造函数的指令,不必显示初始化。
7、 关于构造函数和析构函数函数
CLR自动管理类的析构。在继承体系中,初始化一个继承类时,依次从最顶级的基类构造函数开始执行,析构的时候则以相反顺序执行。
8、 C#中可以使用指针,但是需要加上unsafe标识符,如果要操作其中的某些数据,可能还需要加上fixed关键字防止CLR的自动回收机制,因为无法确定CLR何时回收;
9、 C#中的操作符重载,类型转换:
Public static T operator +(T t1,T t2)
Public static int operator int(T t);
10、 C#中的索引器定义
Public static T this[int index]{return T;}