new的深一步
new的深一步
new运算符
用于创建对象和条用构造函数
new修饰符
用于隐藏基类中被继承的成员
new约束
用于在泛型声明中约束可能用作类型参数的参数类型
new运算符
用于创建对象和调用构造函数。例如:
ClassDemo obj=new ClassDemo();
还可以用于创建匿名类型的实例。例如:
var query=from cust in customers
select new {Name=cust.Name,Addres=cust.PrimaryAddress};
还用于调用值类型的默认构造函数。例如:
int i=new int();
注意:为结构声明默认的构造函数是错误的,因为每一个值类型都隐式具有一个公共的默认构造函数。可以在结构类型上声明参数化构造函数以设置其初始值,但是,只有在需要默认值之外的值时才必须这么做。
值类型对象(例如结构)是在堆栈上创建的,而引用类型对象(例如类)是在堆上创建的。两种类型的对象都是自动销毁的,但是,基于值类型的对象是在超出范畴时销毁,而基于引用类型的对象则是在该对象的最后一个引用被移除之后在某个不确定的时间销毁。对于占用固定资源(例如大量内存、文件句柄或网络连接)的引用类型,有时需要使用确定性终止以确保对象被尽快销毁。
不能重载new运算符。
如果new运算符分配内存失败,将引发异常OutOfMemoryException.
new修饰符
用作隐藏基类中的成员(是基类中的成员,所以字段、属性、时间等等都可以隐藏,不单单是方法)例如:
public class Base
{
public void WriteName(string name)
{
Console.WriteLine(name);
}
}
public class Car:Base
{
//用new隐藏基类中的方法
public new void WriteName(string name)
{
Console.WriteLine("车名:"+name);
}
}
注意:new修饰符只能用于继承类,一般用于弥补基类设计的不足。
new修饰符和override修饰符不可同时在一个成员上,因为这两个修饰符在含以上互相排斥。
new约束
new约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。如果要使用new约束,则该类型不能为抽象类型。
当泛型类创建类型的新实例,请将new约束应用与类型参数。例如:
class ItemFactory<T> where T:new()
{
public T GetNewItem()
{
return new T();
}
}
当与其他约束一起使用时,new()约束必须最后指定:
public class ItemFactory2<T>
where T:IComparable,new()
{
}