转载于:https://www.cnblogs.com/a164266729/p/5278826.html
写new关键字的几种用法(最近看面试题中出现了这个问题,所以百度了一下,转载了这篇写得很详细的文章!)
第一种 创建对象、调用构造函数,这就不用讲了 ClassA A=new ClassA();
第二种 是作为修饰符,显示隐藏继承于基类的继承成员
class Program { static void Main(string[] args) { Class1 cls1 = new Class1(); Class2 cls2 = new Class2(); cls1.Prinf(); cls2.Prinf(); Test t1 = new Class1(); Test t2 = new Class2(); t1.Prinf(); t2.Prinf(); Console.ReadLine(); } abstract public class Test { public virtual void Prinf() { Console.WriteLine("base Printf..."); } } public class Class1 : Test { public override void Prinf() { Console.WriteLine("Class1 Printf..."); } } public class Class2 : Test { public new void Prinf() { Console.WriteLine("Class2 Printf..."); } } }
我们可以看到 打印的最后一条信息 子类继承于父类的方法被隐藏,实现了父类的方法,override 则完全重写了方法,即使转变为基类对象调用的也是派生类的重写方法。
第三种 是用在泛型中添加类型的约束
class Test<T> where T : new()//定义类型T的约束,表示T类型必须有不带参数的构造函数 { public T GetItem() { // return T(); return new T();//如果不添加new()约束,编译错误:变量类型“T”没有 new() 约束,因此无法创建该类型的实例 //想一下,T类型不知道,编译器不知道分配多大的空间,所以会通过反射技术实现 } } class TClass { private int a; public TClass() //如果不添加无参构造函数,编译错误:TClass必须是具有公共的无参数构造函数的非抽象类型,才能用作泛型类型或方法“A.Test<T>”中的参数“T” { } public TClass(int a) { this.a = a; } } class Program { static void Main(string[] args) { Test<TClass> test = new Test<TClass>(); Console.ReadLine(); }
}