zoukankan      html  css  js  c++  java
  • .net程序员的盲点(五):告诉你一个不一样的new

    new有三种用法:

    1.             运算符

    2.             修饰符

    3.             泛型中的new()约束

     

    1.    作为运算符,new在普通不过了,也不多说了。

    比如:MyClass myclass=new MyClass();

    2.    作为泛型中的约束符new也很简单,

    在泛型类型定义时,可以使用where指定一些约束,其中一种就是new约束。new 约束要求用作类型实参的类型必须带有公共无参构造器。

    比如:class A<T> where T : new();

    他的作用是告诉编译器只有带有公共无参构造器的类型才能用作T

    3.    重点是作为修饰符的new

    在用作修饰符时,new 关键字可以替换基类方法。

    例如:

    public class BaseC

    {

        public int x;

        public void Invoke() {}

    }

    public class DerivedC : BaseC

    {

        new public void Invoke() {}

    }

    在这个示例中,DerivedC.Invoke 并不是 BaseC.Invoke,有了new它会自己产生一个Invoke而非继承。其中的字段 x 不受影响,它还是会被继承的。

    当然,对同一成员同时使用 new override 是错误的,因为这两个修饰符在含义上相互排斥。使用 new 会用同样的名称创建一个新成员并使原始成员变为隐藏的,而 override 则扩展继承成员的实现。

    在不隐藏继承成员的声明中使用 new 修饰符将会生成警告。

    示例

    在该例中,基类 BaseC 和派生类 DerivedC 使用相同的字段名 x,从而隐藏了继承字段的值。该示例演示了 new 修饰符的用法。另外还演示了如何使用完全限定名访问基类的隐藏成员。

    using System;

    public class BaseC

    {

        public static int x = 55;

        public static int y = 22;

    }

     

    public class DerivedC : BaseC

    {

        // 这里重新生成了 x,而不是继承的x

        new public static int x = 100;

     

        static void Main()

        {

           

            Console.WriteLine(x);

            // 100

            Console.WriteLine(BaseC.x);

            // 55

            Console.WriteLine(y);

    // 22

     

        }

    }

    输出

    100 55 22

     

     
  • 相关阅读:
    Oracle触发器用法及介绍
    连接mysql用mysql_connect不能连接
    中标麒麟上安装配置达梦数据库7
    (转)全局变量和局部变量区别
    DSP编程与调试总结
    SERCOS总线程序相关
    C编程小结1
    C语言编程的一些小总结
    【转】#define 定义别名和 typedef 声明类型的区别
    DSP开发程序相关问题总结
  • 原文地址:https://www.cnblogs.com/hainange/p/6153369.html
Copyright © 2011-2022 走看看