C#版本控制简单分析

开发 后端
这里介绍C#版本控制是一个过程,它以兼容的方式对组件进行不断的改进。如果依赖于早期版本的代码重新编译后可以适用于新版本,则组件的新版本与早期版本源代码兼容。

在向大家详细介绍C#版本控制之前,首先让大家了解下二进制兼容性,然后全面介绍C#版本控制。

C#版本控制是一个过程,它以兼容的方式对组件进行不断的改进。如果依赖于早期版本的代码重新编译后可以适用于新版本,则组件的新版本与早期版本源代码兼容。相反,如果依赖于早期版本的应用程序不用重新编译即可适用于新版本,则组件的新版本为二进制兼容。

大多数语言根本不支持二进制兼容性,而且许多语言对促进源代码兼容性所做甚少。实际上,某些语言所含的缺陷使得用它开发出来的组件在不断的改进过程中,一般至少会使依赖于该组件的某些客户端代码失效。

例如,请看一个发布名为 Base 的类的基类作者的情况。在***个版本中,Base 不包含任何 F 方法。名为 Derived 的组件从 Base 派生,并引入 F。此 Derived 类与它所依赖的 Base 类一起发布给客户,客户又部署到众多客户端和服务器。

  1. // Author A  
  2. namespace A  
  3. {  
  4.    public class Base      
  5. // version 1  
  6.    {  
  7.    }  
  8. }  
  9. // Author B  
  10. namespace B  
  11. {  
  12.    class Derived: A.Base  
  13.    {  
  14.       public virtual void F() {  
  15.          System.Console.WriteLine("Derived.F");  
  16.       }  
  17.    }  

从这时起,开始产生版本问题。Base 的作者生成了一个拥有自己的 F 方法的新版本。

  1. // Author A  
  2. namespace A  
  3. {  
  4.    public class Base      // version 2  
  5.    {  
  6.       public virtual void F() {        
  7. // added in version 2  
  8.          System.Console.WriteLine("Base.F");  
  9.       }  
  10.    }  

这个新版本的 Base 在源代码和二进制方面都应该与初始版本兼容。(如果仅添加一个新的方法就会产兼容性问题,则基类可能就永远不能改进了。)不幸的是,Base 中的新 F 使 Derived 的 F 的含义不清。Derived 是指重写 Base 的 F 吗?这看上去不太可能,因为编译 Derived 时,Base 还没有 F!此外,如果 Derived 的 F 的确是重写了 Base 的 F,则它必须遵守由 Base 指定的协定(此协定在编写 Derived 时尚未指定)!在某些情况下,这是不可能的。例如,Base 的 F 可能要求它的重写始终调用基方法。Derived 的 F 不可能遵守这样的协定。

C# 通过要求开发人员明确声明它们的意图来解决此版本问题。在原始的代码示例中,代码很清楚,因为 Base 甚至没有 F。很明显,由于不存在名为 F 的基方法,因此 Derived 的 F 是一个新方法而不是对基方法的一个重写。

如果 Base 添加 F 并发布新版本,则在 Derived 的二进制版本中对“Derived 的 F”是什么仍很清楚:它语义上与重写无关,不应将它视为重写。

然而,当重新编译 Derived 时,其含义仍是不清楚的:Derived 的作者可能打算让它的 F 重写 Base 的 F 或者隐藏它。由于意图不清,编译器生成一个警告,并在默认情况下使 Derived 的 F 隐藏 Base 的 F。此编译过程造成了语义上的二义性(与重新编译 Derived 前相比较)。生成的警告提醒 Derived 的作者 Base 中存在 F 方法。以上介绍C#版本控制

【编辑推荐】

  1. C# 3.0编译器简单介绍
  2. C#使用函数重载学习笔记
  3. Visual C#对数据库处理概述
  4. C#具有隐式类型声明描述
  5. C#使用SharpZipLib分析
责任编辑:佚名 来源: cnblogs
相关推荐

2009-08-31 18:24:26

编译C#文件

2009-08-27 18:05:54

C#索引功能

2009-08-27 15:34:38

C#命名空间

2009-08-26 18:00:07

C#内部类

2009-08-27 18:02:22

C#事件处理

2009-09-01 18:36:35

C#委托实例

2009-09-01 18:05:17

C#类型声明

2009-09-04 10:42:56

C#流程控制语句

2009-09-02 10:59:02

C#单路代理

2009-09-03 17:13:19

C#建立项目

2009-08-26 14:01:18

C#标识符

2009-09-01 10:08:57

C#运算符

2009-08-31 16:01:31

C#和设计模式

2009-08-27 10:44:21

C#静态变量

2009-09-04 10:07:42

C#完全限定名

2009-08-28 15:49:45

C#对INI文件操作

2009-08-28 15:19:17

C#实现缩略图

2009-09-02 18:03:19

C#实现泛型类

2009-08-26 13:15:38

C#选择控制

2009-08-31 18:32:01

C# ListBoxE
点赞
收藏

51CTO技术栈公众号