new是我们大家所熟知的英文单词,但在C#中,它是一个关键字,它可以做运算符,也可以做修饰符,还可以用在泛型T参数约束中。下面我们来介绍一下这3种用法。
1、new 运算符:用于创建对象和调用构造函数。这个我们创建对象实例就比较常用了,比如:
StringBuilder str=new StringBuilder();
2、new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。简单的说,就是现在写的这个类,想写一个和基类中相同的成员,而不继承基类的。运用多态的特性时,也不会调用这个显示隐藏的方法。具体看下如下代码:
public class Program { static void Main(string[] args) { animal a = new animal(); a.name = "animal"; a.say(); cat c = new cat(); c.name = "cat"; c.say(); dog d = new dog(); d.name = "dog"; d.say(); sheep s = new sheep(); s.name = "sheep"; s.say(); animal a1 = new cat(); a1.say(); animal a2 = new dog(); a2.say(); animal a3 = new sheep(); a3.say(); } } class animal { public string name { get; set; } public virtual void say() { Console.WriteLine("animal say"); } } class cat : animal { public override void say() { Console.WriteLine("cat say"); } } class dog : animal { public new void say() //这个方法被显示隐藏了 { Console.WriteLine("dog say"); } } class sheep : animal { }
3、new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。举个例子看一下,泛型类中T要求有一个无参的构造函数,代码如下,
public class Employee { private string name; private int id; public Employee() { name = "Temp"; id = 0; } public Employee(string s, int i) { name = s; id = i; } public string Name { get { return name; } set { name = value; } } public int ID { get { return id; } set { id = value; } } } class ItemFactory where T : new() { public T GetNewItem() { return new T(); } } public class Test { public static void Main() { ItemFactory EmployeeFactory = new ItemFactory(); ////此处编译器会检查Employee是否具有公有的无参构造函数。 //若没有则会有The Employee must have a public parameterless constructor 错误。 Console.WriteLine("{0}'ID is {1}.", EmployeeFactory.GetNewItem().Name, EmployeeFactory.GetNewItem().ID); } }