.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 修饰符将会生成警告。

var ExpCollDivStr = ExpCollDivStr; ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl084380344,"; var ExpCollImgStr = ExpCollImgStr; ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl08img,"; <shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="ctl00_LibFrame_ctl08img" style="WIDTH: 12pt; HEIGHT: 12pt" o:button="t" alt="示例" type="#_x0000_t75" o:spid="_x0000_i1026"><imagedata o:href="http://msdn2.microsoft.com/msdn/Controls/CollapsibleArea/en-us/minus.gif" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.gif"></imagedata></shape>示例

在该例中,基类 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值