C#的new关键字的几种用法

时间:2023-01-29 12:41:54
1.new 运算符用于创建对象和调用构造函数:
 Test01 test = new Test01();
new 运算符还可以用于创建值类型的默认构造函数:
int i = new int();
i被初始化为0,因为它是int类型的默认值。该语句等同于:int i = 0;
如果new运算符分配内存失败,则它将引发OutOfMemoryException异常.
不能重载new 运算符

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

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

2.new 修饰符可以显式隐藏从基类继承的成员,隐藏继承的成员时,该成员的派生版本将替换基类版本。虽然可以在不使用new修饰符的情况下隐藏成员,但会生成警告,如果用new显示隐藏成员,则会取消该警告,并记录要替换为派生版本这一事实。如要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并使用new修饰符修饰该成员。例如:

 
 

    class Program
    {
        public int x;
        public void TestMethod()
        {
            Console.WriteLine("我是基类的方法"); 
        }
    }

    class Test:Program
    {
        new public void TestMethod()
        {
            Console.WriteLine("我是派生类的方法");
        }
    }
在此示例中,Test.TestMethod隐藏了Program.TestMethod。字段x不受影响,因为它没有被类似名称的字段隐藏。
通过继承隐藏名称采用以下形式之一:
1。引入类或结构中的常数,指定,属性或类型隐藏具有相同名称的所有基类成员。
2。引入类或结构中的方法隐藏基类中具有相同名称的属性,字段和类型,同时也隐藏具有相同签名的所有基类方法。
3。引入类或结构中的索引器将具有相同名称的所有基类索引器。
对同一成员同时使用new和override是错误的做法,因为这两个修饰符的含义互斥,new修饰符会用同样的名称创建一个新成员并使原始成员变为隐藏的。override修饰符会扩展继承成员的实现,在不隐藏继承成员的声明中使用new修饰符将会生成警告。

3.new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数,如果使用new约束,则该类型不能为抽象类型。
当泛型类型创建类型的新实例,请将new 约束应用于类型参数,如下面示例所示
 
 
 class ItemFactory<T> where T : new()
    {
        public T GetNewItem()
        {
            return new T();
        }
    }
当与其他约束一起使用时,new()约束必须最后指定:
 
 
  public class ItemFactory2<T>
     where T : IComparable, new()
    {
    }