总体了解C#(13.版本处理)
13.版本处理
解决版本问题已成为.NET框架一个主要考虑。这些考虑的大多数都体现于组合体中。在C#中,可在同一个进程里运行同一个组合体的不同版本的能力是令人印象深刻的。
当代码的新版本(尤其是.NET库)被创建时,C#可以防止软件失败。C#语言参考里详细地描述了该问题。我用一个例子简明扼要地讲解如下:
在Java中,假定我们部署一个称为D的类,它是从一个通过VM发布的叫B的类派生下来的。类D有一个叫foo的方法,而它在B发布时,B还没有这个方法。后来,对类B做了个升级,现在B包括了一个叫foo的方法,新的VM现在安装在使用类D的机器上了。现在,使用D的软件可能会发生故障了,因为类B的新实现可能会导致一个对D的虚函数调用,这就执行了一个类B始料未及的动作。【译注:因Java中方法缺省是虚的】在C#中,类D的foo方法应该声明为不用override修饰符的(这个真正表达了程序员的意愿),因此,运行时知道让类D的foo方法隐藏类B的foo方法,而不是重载它。
引用C#参考手册的一句有意思的话“C#处理版本问题是通过需要开发人员明确他们的意图来实现的”。尽管使用override是一个表达意图的办法,但编译器也能自动生成—通过在编译时检查方法是否在执行(而不是声明)一个重载。这就意味着,你仍然能够拥有象Java一样的语言(Java不用virtual和override关键字),并且仍然能够正确处理版本问题。
参见字段修饰符部分。