MSDN(c#2.0):
在msdn中,指出new的三种用法。即,作为操作符(operator)、修改符(modifier)、约束(constraint)使用。
一、new操作符用于创建
(1)在堆迭(heap,可以想象为一面墙倒塌后砖头间的堆叠状;而stack则是线性描述)上,使用newobj命令创建对象并显式调用构建(constructor)。
如,myclass mytest= new myclass();
(2)对于值类型(value type),new使用initobj命令,隐式调用构建,用来初始化值。
如,int myint = new int();//相当于int myint = 0;
注意事项:
(a)不能为结构(struct)声明默认的构建
(b)值类型对象创建于栈,如结构;引用类型对象创建于堆(heap)
(c)new不能被过载(overloaded)
(d)new操作符不能定位内存时,会抛出异常OutOfMemoryException
二、new修改符用于派生类中的基类隐藏
(1)new用于派生类中,强制隐藏继承来的(inherited)基类成员(当然是同名的)。
(2)new用于隐藏继承时,遵守以下规则:
a/对于类或结构的常量、字段、属性以及第一次引用的类型(type)-隐藏基类成员;
b/对于类或结构第一次引用的函数-用来隐藏属性、字段和类型;对于相同签名的函数,则隐藏整个函数;
c/对于类或结构第一次引用的索引器-相同的签名(same signature)隐藏基类整个索引器;
d/对于嵌套类-在继承时,new隐藏基类的成员。
注意事项:
(1)对于继承关系的同名成员,如基类的虚拟方法机制,不允许同时使用关键字new和override,两者效果等效;
(2)对于继承关系的同名成员,在声明时,如果不显式使用new来隐藏继承的成员,会产生编译器警告;
主要用途示例:
// cs_modifier_new.cs
// The new modifier
using System;
public class MyBaseC
{
public static int x = 55;
public static int y = 22;
}
public class MyDerivedC : MyBaseC
{
new public static int x = 100; // Name hiding
public static void Main()
{
// Display the overlapping value of x:
Console.WriteLine(x);
// Access the hidden value of x:
Console.WriteLine(MyBaseC.x);
// Display the unhidden member y:
Console.WriteLine(y);
}
}
///output:
///100
///55
///22
三、约束
(1)对泛型参数的类型多态性进行限制,类型参数(type argument)必须使用公共(public)无参(parameterless)的构建方法(即公共的、默认构造函数)来建立。见示例1。<注,这点似乎比较低极,为什么不能带参呢?请大家讨论。>
(2)new约束与其它形式的约束一起时,new约束须在最后出现。见示例2。
示例1:
class ItemFactory<T> where T : new()
{
public T GetNewItem()
{
return new T();
}
}
示例2:
using System;
public class ItemFactory<T>
where T : IComparable, new()
{
}
蕴含:new,即新,意味着该关键字有优秀的添加、删除能力:
(1)处在创建过程
(2)没有被使用或拥有
(3)替代原物,原物不存在,或原物不再有用.
致用:
~要“新”一个物件时,使用new好了。
~一般用对象的无参构建来创建,如class_anyThing myclass = new class_anyThing();有参数时,在圆括号中放参数吧。
~形成(泛型)约束时,忽略掉类型,简写声明为new()。