C# new关键字详解

知道91 | .Net | 2015-11-22 | 阅读:5311

先问大家一个问题,在C#中浅蓝色和深蓝色有什么不同?不卖关子了,浅蓝色就是C#中定义的关键字了,而深蓝色就是.NET下的类Class了。

csharp

在 C# 中,new 关键字可用作运算符、修饰符或约束,有以下几点:

  • new 运算符:用于创建对象和调用构造函数。
  • new 修饰符:用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。
  • new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。

new关键字在我们的程序中可谓是无时不刻在用到,那么new关键字都可以用在哪些地方呢?考虑以下几个问题:

1、new一个class对象和new一个struct或者new一个enum有什么不同?

  • new一个class时,new完成2个内容:一是调用new obj命令为实例在托管堆中分配内存,二是调用构造函数实现对象初始化。
  • new一个struct时,new运算符用于调用其构造函数,完成实例的初始化。

2、new在.NET中除了创建对象实例外,还可以做什么?

new关键字:作为运算符可以创建对象和调用构造函数;

  作为修饰符可以用于向基类成员隐藏继承成员,实现派生类中隐藏基类的virtual方法,不能和override共存;

  作为约束可以在泛型声明中约束可能用作类型参数的参数类型,即new约束指定泛型类声明中的任何类型参数都必须要有公共的无参构造函数;

  使用new关键字实现多态。

3、new运算符可以重载吗?

new运算符不可以重载。

4、泛型中new关键字的作用?

new运算符用于返回一个引用,指向系统分配的托管堆的内存地址,new分配内存失败,将引发OutOfMemoryException异常。

5、new一个继承下来的方法和override有什么区别?

new是隐藏基类方法,override是覆写基类方法。如果要访问new隐藏了的基类成员需要使用base关键字实现。

    隐藏和重写基类方法的异同

    1:方法重写:就是在基类中的方法用virtual关键字来标识,然后在继承类中对该类进行重写(override),这样基类中的方法已经被重写了,已经失去了功能了。当让基类的对象的引用直接指向继承类的对象时(多态性),调用该方法则是调用的继承类的方法。

    2:方法隐藏:无论基类中的方法是否用了virtual关键字,继承类中都可以用new关键字(如果不用new的话,不会产生错误,但会生成一个编译警告)将基类中的方法隐藏,所谓隐藏就是隐藏,不像重写,重写就是原来的(基类中)已经不存在了,而隐藏是原来的还存在。所以当让基类的对象的引用直接指向继承类的对象时(多态性),调用该方法则是调用的基类的方法。

public class BaseClass
    {
        public void functionA()
        {
            Console.WriteLine("BaseFunctionA http://www.zhidao91.com/sosoft/");
        }
        public virtual void functionB()
        {
            Console.WriteLine("BaseFunctionB http://www.zhidao91.com/sosoft/");
        }
    }
   public class DerivedClass:BaseClass
    {
        public new void functionA()
        {
            Console.WriteLine("DerivedFunctionA http://www.zhidao91.com/sosoft/");
        }
        public override void functionB()
        {
            Console.WriteLine("DerivedFunctionB http://www.zhidao91.com/sosoft/");
        }
    }

调用:

BaseClass baseFunction=new DerivedClass();
baseFunction.functionA();
baseFunction.functionB();

得到的结果是:

    BaseFunctionA http://www.zhidao91.com/sosoft/

    DerivedFunctionB http://www.zhidao91.com/sosoft/

微软

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

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

总结

是不是不看不知道,原来Csharp中new关键字有这么多的用法,其实C#的水还是很深的。