您的位置:首页 > 其它

建议95:避免在构造方法中调用虚成员

2016-09-09 09:59 218 查看
建议95:避免在构造方法中调用虚成员

在构造方法中调用虚方法会带来一些意想不到的错误,虽然这种方法不常见,但还是需要注意这类陷阱。

static void Main()
{
American american = new American();
Console.ReadKey();
}

class Person
{
public Person()
{
InitSkin();
}

protected virtual void InitSkin()
{
//省略
}
}

class American : Person
{
Race Race;

public American()
: base()
{
Race = new Race() { Name = "White" };
}

protected override void InitSkin()
{
Console.WriteLine(Race.Name);
}
}

class Race
{
public string Name { get; set; }
}


运行会出现异常NullReferenceException:未将对象引用设置到对象的实例。

在调用者代码中,我们需要创建一个American的实例对象american。由于发现实例还存在一个积累Person,所以运行时会首先调用基类的构造方法。在构造方法中Person调用了虚方法InitSkin。由于是虚方法,所以会在运行时调用子类的InitSkin方法。子类的InitSkin方法中,需要打印出名字。而这个时候,方法的调用堆栈还一直在基类的构造方法内,也就是在子类的构造方法中的代码还完全没有执行:

Race = new Race() { Name = "White" };


所以会抛出异常。

基于以上原因,建议不要在构造方法中调用虚成员。

 

 

转自:《编写高质量代码改善C#程序的157个建议》陆敏技
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  构造方法