C#版本控制2007-11-10 本站 版本控制(Versioning)主要是为了解决组件的版本不兼容的问题。版本兼容的方式有:●源代码级兼容:依赖于旧版本的代码在重新编译之后能够与新版本兼容。●二进制兼容:依赖于旧版本的应用程序无需重新编译就能与新版本兼容。大多数语言根本不支持二进制级的版本兼容,其中许多在源代码级的兼容问题上也表现的不尽如人意。事实上,许多语言由于自身的缺陷,不改写客户代码就不可能实现组件的升级。举个例子,假设基类的作者写了一个叫Base的类。在第一个版本中,类Base中没有包含方法F。一个叫Derived的类从Base中继承,并且声明了一个方法F。类Derived和类Base一同被交付客户使用,并且配置到许多客户机和服务器上。
// Author Anamespace A{ public class Base //version 1 { }}//Author Bnamespace B{ class Derived:A.Base { public virtual void F(){ System.Console.WriteLine("Derived.F"); } }}
到目前为止,程序的运行一切正常。然后,Base类的作者提供了一个新版本,给类Base添加了一个方法F。
//Author Anamespace A{ public class Base //version 2 { public virtual void F(){//added in version 2 System.Console.WriteLine("Base.F"); } }}
新版本的Base应该和旧版本保持源代码级兼容和二进制级兼容。不幸的是,类Base中的新方法与类Derived中的F产生了混淆。Derived应该重载Base中的F吗?看上去不应该,因为Derived已经被编译,那时Base中甚至还没有F!但是,如果Derived中的F不重载Base中的F,而它又必须符合基类Base的声明,可是在写Derived类时还不存在该声明。比如某种情况下,Base中的F可能要求被重载。在解决版本问题时,C#要求开发人员清楚地表达他们的意图。在原始代码中,类Base不包括方法F,所以不存在什么问题。Derived中的F是作为一个新方法,而不是重载基类中的方法。
//Author Anamespace A{ public class Base { }}//Author Bnamespace B{ class Derived:A.Base {public virtual void F(){ System.Console.WriteLine("Derived.F");} }}