一、new 运算符 用于创建对象和调用构造函数。

        1、用于创建对象和调用构造函数
  例:Class_Test MyClass = new Class_Test();
  2、也用于为值类型调用默认的构造函数

  例:int myInt = new int();

  myInt 初始化为 0,它是 int 类型的默认值。该语句的效果等同于:int myInt = 0;

  3、不能重载 new 运算符。
  4、如果 new 运算符分配内存失败,则它将引发 OutOfMemoryException 异常。

        请记住,为结构声明默认的构造函数是错误的,因为每一个值类型都隐式具有一个公共的默认构造函数。可以在结构类型上声明参数化构造函数以设置其初始值,但是,只有在需要默认值之外的值时才必须这样做。

         值类型对象(例如结构)是在堆栈上创建的,而引用类型对象(例如类)是在堆上创建的。两种类型的对象都是自动销毁的,但是,基于值类型的对象是在超出范围时销毁,而基于引用类型的对象则是在对该对象的最后一个引用被移除之后在某个不确定的时间销毁。对于占用固定资源(例如大量内存、文件句柄或网络连接)的引用类型,有时需要使用确定性终止以确保对象被尽快销毁。有关更多信息,请参见 using 语句(C# 参考)。

不能重载 new 运算符

二、new 修饰符 用于隐藏基类成员的继承成员。

        在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。隐藏继承的成员意味着该成员的派生版本将替换基类版本。在不使用 new 修饰符的情况下隐藏成员是允许的,但会生成警告。使用 new 显式隐藏成员会取消此警告,并记录代之以派生版本这一事实。

        若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并使用 new 修饰符修饰该成员。例如:

 

public 
    
  class 
   BaseC 
{
     
  public 
    
  int 
   x;
     
  public 
    
  void 
   Invoke() {}
}
 
  public 
    
  class 
   DerivedC : BaseC
{
     
  new 
    
  public 
    
  void 
   Invoke() {}
}

在此示例中,DerivedC.Invoke 隐藏了 BaseC.Invoke。字段 x

通过继承隐藏名称采用下列形式之一:

  • 引入类或结构中的常数、指定、属性或类型隐藏具有相同名称的所有基类成员。
  • 引入类或结构中的方法隐藏基类中具有相同名称的属性、字段和类型。同时也隐藏具有相同签名的所有基类方法。
  • 引入类或结构中的索引器将隐藏具有相同名称的所有基类索引器。

对同一成员同时使用 new 和 override 是错误的,因为这两个修饰符在含义上相互排斥。使用 new 会用同样的名称创建一个新成员并使原始成员变为隐藏的,而 override 则扩展继承成员的实现。

三、new 约束 

         new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。当泛型类创建类型的新实例时,将此约束应用于类型参数,如下面的示例所示:

 

class 
   ItemFactory 
  < 
  T 
  > 
    
  where 
   T :  
  new 
  ()
{
     
  public 
   T GetNewItem()
    {
         
  return 
    
  new 
   T();
    }
}

当与其他约束一起使用时,new() 约束必须最后指定:


using 
   System;
 
  public 
    
  class 
   ItemFactory 
  < 
  T 
  > 
    
  where 
   T : IComparable,  
  new 
  ()
{
}