c# 优化代码的一些规则——什么情况下应该使用new[七]

前言

new 在重构这本书中写道new就是坏代码的味道,说明使用new的情况并不多。

在这里我指的new 是方法修饰符,而不是指实例。

正文

看下new的作用:

new 修饰符可以重新定义从基类继承下来的非虚成员。

也就是说你考虑的是是不是需要重新定义,如果不需要那么就不应该使用new。

使用一个new 产生的一个问题:

MakeObject:

public class MakeObject: MyOtherClass
{
}

MyOtherClass:

public class MyOtherClass:MyClass
{
	public new void MagicMethod()
	{
		Console.WriteLine(nameof(MyOtherClass));
	}
}

MyClass:

public class MyClass
{
	public void MagicMethod()
	{
		Console.WriteLine(nameof(MyClass));
	}
}

那么看一下:

static void Main(string[] args)
{
	MakeObject make = new MakeObject();
	MyClass c1=make as MyClass;
	c1.MagicMethod();
	MyOtherClass c2=make as MyOtherClass;
	c2.MagicMethod();
	Console.ReadKey();
}

运行结果为:

MyClass
MyOtherClass

其实我们也能猜到结果就是这个,那么有什么问题呢?

我们使用同一个对象C上面调用同一个方法居然结果不一致,这取决于类型转换为MyClass 或者MyOtherClass 。

这样一看好像没什么问题,但是却不是。

因为如果你想让其子类重写,你可以设置为virtual,也就是虚方法。

这个new 其实就是让我们来兼容一些东西的。

比如说MyClass 原本没有MagicMethod 方法,但是后来加了这个MagicMethod 。

然后这时候myclass 的地方又非常多的地方使用,这时候就会报错,当然现在会自动加上new了。

这只是给我们一个缓存区,最好的方式还是去修改子类的方法名,因为最后可能我们还是要调用到MyClass 的MagicMethod 方法,这时候新的问题又产生了。

原文地址:https://www.cnblogs.com/aoximin/p/13024308.html