C#中new的用法及与override的区别分析

C#中new的用法有三种:

(1)new是运算符,用于创建对象和调用构造函数。如Class1=new Class1();也可以为值类型调用默认的构造函数如int a=new int();此时a=0.

(2)new是修饰符,用于隐藏基类成员的继承成员。override不能隐藏积累成员的继承成员。如:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace A
{

  class Program
  {
    abstract public class Test
    {
      public virtual void Prinf()
      {
        Console.WriteLine("Abstract Printf...");
      }
    }
    public class Class1 : Test
    {

      public override void Prinf()
      {

        Console.WriteLine("Class One Override Printf...");
      }

    }

    public class Class2 : Test
    {
      public new void Prinf()
      {

        Console.WriteLine("Class Two New Printf...");
      }
    }

    static void Main(string[] args)
    {

      Class1 cls1 = new Class1();
      Class2 cls2 = new Class2();
      cls1.Prinf();
      cls2.Prinf();
      ((Test)cls1).Prinf();
      ((Test)cls2).Prinf();

      Console.ReadLine();    

    }
  }
}

运行结果表明:new修饰符隐藏了重写方法,通过将派生对象转为为基类对象,调用了基类的方法。而override则是完全重写了方法,即便是转为基类对象也调用的也是派生类的重写方法。

即:new隐藏的基类方法,override重写基类方法。

(3)new是约束。用在泛型中添加类型的约束。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace A
{
  class Test<T>
    where T : new()//定义类型T的约束,表示T类型必须有不带参数的构造函数
  {
    public T GetItem()
    {
      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();    

    }
  }
}

注释:参考http://msdn.microsoft.com/zh-cn/library/sd2w2ew5.aspx

(0)

相关推荐

  • C#中new的几种用法详解

    在 C# 中,new 关键字可用作运算符.修饰符或约束. new 运算符 用于创建对象和调用构造函数. new 修饰符 用于向基类成员隐藏继承成员. new 约束 用于在泛型声明中约束可能用作类型参数的参数的类型. new 修饰符(C# 参考) 在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员.隐藏继承的成员意味着该成员的派生版本将替换基类版本.在不使用 new 修饰符的情况下隐藏成员是允许的,但会生成警告.使用 new 显式隐藏成员会取消此警告,并记录代之以派生版本这一事实. 若要隐

  • C#基础知识之new关键字介绍

    一.运算符 用于创建对象和调用构造函数.这种大家都比较熟悉,没什么好说的了. 二.修饰符 在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员. 无new关键字代码: 有new关键字代码: 结果: 注意: 在子类中用 new 关键字修饰定义的与父类中同名的方法,叫覆盖.覆盖不会改变父类方法的功能. 当子类创建父类时,代码中A c = new B(),覆盖不会改变父类的功能.依然还是调用父类的功能. 三.new 约束 用于在泛型声明中约束可能用作类型参数的参数的类型. public clas

  • C# new和override的区别分析

    昨天面试问到了new的几种用法以及与Override的区别,有点模糊 回来google下,new的用法有以下3中 1.运算符:初始化对象和调用构造函数 2.修饰符:隐藏基类方法 3.于在泛型声明中约束可能用作类型参数的参数的类型 至于作为修饰符和override的区别,看了下文章不太明白,写了个例子,运行结果,发现了差异,下面分享下代码: using System; using System.Collections.Generic; using System.Linq; using System

  • 深入理解C#中new、override、virtual关键字的区别

    OO思想现在已经在软件开发项目中广泛应用,其中最重要的一个特性就是继承,最近偶简单的复习了下在C#中涉及到继承这个特性时,所需要用到的关键字,其中有一些关键点,特地整理出来,方便大家查阅. 一.在C#中,new这个关键字使用频率非常高,主要有3个功能: a) 作为运算符用来创建一个对象和调用构造函数. b) 作为修饰符. c) 用于在泛型声明中约束可能用作类型参数的参数的类型. 在本文中,只具体介绍new作为修饰符的作用,在用作修饰符时,new关键字可以在派生类中隐藏基类的方法,也就说在使用派生

  • 详解C#用new和override来实现抽象类的重写区别

    一,抽象的实现 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Virtualdemo { class Program { static void Main(string[] args) {//BClass A = new BClass(); 抽象类无法被实例 Class1 c = new Class1(); BClass c2 = c; c2.Meth

  • 基于C# 中可以new一个接口?的问题分析

    如果有人问你,C# 中可以new 一个接口吗?,你会怎么回答? 假设ITestInterface 是一个接口,那么这样的代码是否有问题? ITestInterface testInterface = new ITestInterface(); 很多书上都会说,当然有问题,接口不能用new ,然后你就认为上面这句语句肯定通不过编译器的编译了. 可是凡事无绝对,C# 竟然允许你这么写,当然你需要加点"料"才行. 在VS2005 中新建控制台程序CA2005.添加 Microsoft.Off

  • C#中Override关键字和New关键字的用法详解

    C# 语言经过专门设计,以便不同库中的基类与派生类之间的版本控制可以不断向前发展,同时保持向后兼容.这具有多方面的意义.例如,这意味着在基类中引入与派生类中的某个成员具有相同名称的新成员在 C# 中是完全支持的,不会导致意外行为.它还意味着类必须显式声明某方法是要重写一个继承方法,还是一个隐藏具有类似名称的继承方法的新方法. 在 C# 中,派生类可以包含与基类方法同名的方法. 基类方法必须定义为 virtual. 如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警

  • .net(c#)中的new关键字详细介绍

    1)new 运算符:用于创建对象和调用构造函数.这种大家都比较熟悉,没什么好说的了.2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员.3)new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型. new关键字在我们的程序中可谓是无时不刻在用到,那么new关键字都可以用在哪些地方呢?考虑以下几个问题: 1.new一个class对象和new一个struct或者new一个enum有什么不同? 答:new一个class时,new完成2个内容:一是调用newobj命令

  • C#中new和override的区别个人总结

    问题: A类 有方法 public virtual void test() B类继承自A类,有方法 public new void test()  如下实例化: A a = new B(); a.test(); 会调用哪个类中的TEST方法,最好能详细给我解释一下好吗?先谢谢了! 回答: 如果你用override,则无论调用的是A类还是B类中的TEST(),系统都会找到它实质类的TEST(): 如果是用的New,则可以通过类型转换调用到基类的TEST(): 下面是override的情况: A a

  • C#中new的用法及与override的区别分析

    C#中new的用法有三种: (1)new是运算符,用于创建对象和调用构造函数.如Class1=new Class1();也可以为值类型调用默认的构造函数如int a=new int();此时a=0. (2)new是修饰符,用于隐藏基类成员的继承成员.override不能隐藏积累成员的继承成员.如: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace A {

  • VC中CWinThread类以及和createthread API的区别分析

    本文实例讲述了VC中CWinThread类以及和createthread API的区别分析,分享给大家供大家参考.具体分析如下: CWinThread CObject  └CCmdTarget     └CWinThread CWinThread对象代表在一个应用程序内运行的线程.运行的主线程通常由CWinApp的派生类提供:CWinApp由CWinThread派生.另外,CWinThread对象允许一给定的应用程序拥有多个线程. CWinThread支持两种线程类型:工作者线程(Worker

  • Android中的Dalvik和ART详解及区别分析

    要想知道Dalvik和ART区别分析,首先我们要分别知道这两者是什么? 什么是Dalvik? Dalvik是Google公司自己设计用于Android平台的虚拟机. Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一. 它可以支持已转换为 .dex格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统. Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用

  • C++中sprintf使用的方法与printf的区别分析

    本文实例讲述了C++中sprintf使用的方法与printf的区别.分享给大家供大家参考.具体分析如下: 首先我们在MSDN看一下printf的原型和sprintf的原型 复制代码 代码如下: int printf( const char *format [, argument]... ); 和 复制代码 代码如下: int sprintf( char *buffer, const char *format [, argument] ... ); 从定义来看两者的功能其实很相似的. 如果你接触的

  • Python中lambda的用法及其与def的区别解析

    python中的lambda通常是用来在python中创建匿名函数的,而用def创建的方法是有名称的,除了从表面上的方法名不一样外,python中的lambda还有如下几点和def不一样: 1. python lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而def则会把函数对象赋值给一个变量. 2. python lambda它只是一个表达式,而def则是一个语句. 下面是python lambda的格式,看起来非常精简. lambda x: print x 如果你在pyt

  • C#中StringBuilder用法以及和String的区别分析

    String类有不可改变性.每次执行字符操作时,都会创建一个新的String对象. StringBuilder 类解决了对字符串进行重复修改的过程中创建大量对象的问题.初始化一个StringBuilder 之后,它会自动申请一个默认的StringBuilder 容量(默认值是16),这个容量是由Capacity来控制的.并且允许,我们根据需要来控制Capacity的大小,也可以通过Length来获取或设置StringBuilder 的长度. 举例: 用String类这么写 复制代码 代码如下:

  • Java overload和override的区别分析

    方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现.重写(Overriding)是父类与子类之间多态性的一种表现,而重载(Overloading)是一个类中多态性的一种表现. 如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding).子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了. 如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型或有不同的参

  • PHP中break及continue两个流程控制指令区别分析

    以下举例说明break 用来跳出目前执行的循环,并不再继续执行循环了. 复制代码 代码如下: <?php $i = 0; while ($i < 7) { if ($arr[$i] == "stop") { break; } $i++; } ?> continue 立即停止目前执行循环,并回到循环的条件判断处,继续下一个循环. 复制代码 代码如下: <?php while (list($key,$value) = each($arr)) { if ($key =

  • jQuery中的.bind()、.live()和.delegate()之间区别分析

    DOM树 首先,可视化一个HMTL文档的DOM树是很有帮助的.一个简单的HTML页面看起来就像是这个样子: 事件冒泡(又称事件传播) 当我们点击一个链接时,其触发了链接元素的单击事件,该事件则引发任何我们已绑定到该元素的单击事件上的函数的执行. 复制代码 代码如下: $('a').bind('click',function(){alert('that tickles!')}) 因此一个单击操作会触发alert函数的执行. click事件接着会向树的根方向传播,广播到父元素,然后接着是每个祖先元素

随机推荐