最近面试中有一道题是写new关键字的几种用法,想了下写下我知道的两种用法面试
第一种 建立对象、调用构造函数,这就不用讲了 ClassA A=new ClassA();ide
第二种 是做为修饰符,显示隐藏继承于基类的继承成员 函数
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 则彻底重写了方法,即便转变为基类对象调用的也是派生类的重写方法。this
第三种 是用在泛型中添加类型的约束spa
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(); } }