Welcome

首页 / 软件开发 / .NET编程技术 / [你必须知道的.NET] 第五回:深入浅出关键字---把new说透

[你必须知道的.NET] 第五回:深入浅出关键字---把new说透2011-03-14 博客园 Anytao相关文章:

本文将介绍以下内容:

面向对象基本概念

new关键字深入浅出

对象创建的内存管理

1.引言

园子里好像没有或者很少把new关键字拿出来说的,那我就占个先机吧,呵呵。那么,我们到底有必要将一个关键字拿出来长篇大论吗?看来是个问题。回答的关键是:你真的理解了new吗?如果是,那请不要浪费时间,如果不是,那请继续本文的循序之旅。

下面几个 问题可以大概的考察你对new的掌握,开篇之前,希望大家做个检验,如果通过了,直接关掉本页即可。如果没有通过,希望本文的阐述能帮你找出答案。

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

new在.NET中有几个用途,除了创建对象实例,还能做什么?

new运算符,可以重载吗?

范型中,new有什么作用?

new一个继承下来的方法和override一个继承方法有何区别?

int i和int i = new int()有什么不同?

2.基本概念

一般说来,new关键字在.NET中用于以下几个场合,这是MSDN的典型解释:

作为运算符, 用于创建对象和调用构造函数。

本文的重点内容,本文在下一节来重点考虑。

作为修饰符,用于向基类成员隐藏继承成员。

作为修饰符,基本的规则可以总结为:实现派生类中隐藏方法,则基类方法必须定义为virtual;new作为修饰符,实现隐藏基类成员时,不可和override共存,原因是这两者语义相斥:new用于实现创建一个新成员,同时隐藏基类的同名成员;而override用于实现对基类成员的扩展。

另外,如果在子类中隐藏了基类的数据成员,那么对基类原数据成员的访问,可以通过base修饰符来完成。

例如:

new作为修饰符

using System;

namespace Anytao.net.My_Must_net
{
class Number
{
public static int i = 123;

public void ShowInfo()
{
Console.WriteLine("base class---");
}

public virtual void ShowNumber()
{
Console.WriteLine(i.ToString());
}
}

class IntNumber : Number
{
new public static int i = 456;

public new virtual void ShowInfo()
{
Console.WriteLine("Derived class---");
}

public override void ShowNumber()
{
Console.WriteLine("Base number is {0}", Number.i.ToString());
Console.WriteLine("New number is {0}", i.ToString());
}
}

class Tester
{
public static void Main(string[] args)
{
Number num = new Number();
num.ShowNumber();
IntNumber intNum = new IntNumber();
intNum.ShowNumber();

Number number = new IntNumber();
//究竟调用了谁?
number.ShowInfo();
//究竟调用了谁?
number.ShowNumber();
}
}
}