为什么.NET中的System.Version被定义为Major.Minor.Build.Revision?

74
为什么 .NET 中的 System.Version 被定义为 Major.Minor.Build.Revision?几乎每个人(包括我)都认为修订版本应该放在第三位,而“构建”或你喜欢的任何名称应该放在最后。
微软是否会以这种杂乱无章的方式使用数字,例如 3.5.3858.2,还是这些名称本身就是反过来的?例如,如果您要编写自己的 Version 类,并采用 Major.Minor.Build.Revision 的顺序,那么在转换为 System.Version 时交换最后两个组件是否正确,还是忽略它并假装名称是反过来的?

4
这是我今天看到的最有灵感的问题... 我一直想知道这个问题,却从未想过去问! - codekaizen
Major.Minor.Micro-Build 有什么问题? - Yousha Aleayoub
4个回答

38

我认为混淆是因为大多数人认为“修订版本”和Microsoft的定义不同:

  • Build: 构建编号的差异表示相同源代码的重新编译。这可能是由于处理器、平台或编译器更改所导致的。

  • Revision: 具有相同名称、主要版本号和次要版本号但不同修订版本的程序集旨在完全互换。这对于修复先前发布的程序集中的安全漏洞是合适的。

安全修补方面,可能更常见,似乎是将其放在最后一个位置的一个不错的理由,作为“最小”的变化。


这很有道理。但是使用主版本.次版本.修订版本.构建版本的自己的版本类时,将最后两个组件交换转换为.NET System.Version是否合适?还是保持不变,并让它们在每个结构中被相反的名称调用? - Jake Petroules
1
@Jake - 我想这取决于每个人构建的方式...就我个人而言,我会交换它们,我的约定实际上是 Major.Minor.Revision.ChangeSet,这样我只需瞥一眼号码就可以得到源代码控制中正在运行的确切代码。由于我们进行持续集成,对于我们来说,变更集和构建编号是同义词,这是有意义的...但不确定在其他地方是否适用。 - Nick Craver

32
我知道我来晚了,但我想分享一下为什么构建和修订顺序“错误”的问题。问题并不是它们的顺序“错误”,而是它们没有任何顺序。
当涉及到程序集的版本时,实际上是 Major.Minor。根据前面提到的 link,微软表示,“仅通过构建或修订号码不同的程序集的后续版本被视为先前版本的热修复更新。” [我的强调]
“构建”代表对相同源代码的重新编译。“修订”代表代码更改,但与同一[Major.Minor]版本的其他修订版本完全可以互换。但两者都不优先于另一个。
因此,总之,不要把它看作:
+ Major
|
+-+ Minor
  |
  +-+ Build
    |
    +-+ Revision

但实际上:
+ Major
|
+-+ Minor
  |
  +-+ Build
  |
  +-+ Revision

这个解释让事情变得不那么混乱了。在不同的机器上验证是否安装了相同的 .Net 修订版本真的很困难。具体来说,“修订”号似乎在不同的 OS 版本之间总是不同,而主要、次要和构建号都是相同的。例如,在 Windows 8.1 上,我的“...\Framework64\v4.0.30319\clr.dll”为 4.0.30319.34014,但在 Win2k8 r1 服务器上,该文件的版本为 4.0.30319.18444。 - Granger
我认为这个答案更好,因为我通过树更容易理解。谢谢。 - Nk54

16

微软是否会以3.5.3858.2这样的不规则数字格式来使用版本号?

如果你让它默认,例如通过指定[assembly: AssemblyVersion("1.1.*")],那么第三个数字将每天递增,第四个数字是从午夜开始的秒数除以二(以消除如果在一天内有多个构建的歧义)。

几乎所有人(包括我)似乎都认为修订号应该放在第三位,“build”或者其他你想称呼它的东西应该放在最后。

微软似乎将“build”作为“day”的同义词:也许这与“每日构建”的概念有关;而“revision”则是(每日)构建的另一个版本。


不完全是问题所问的。他不是在问它们是什么,而是为什么它们以这种特定的顺序排列。 - Alastair Pitts
@Alastair Pitts - 我已经更新了我的回答,试图解决这个问题。 - ChrisW
7
修订号并非随机生成的,它是距离午夜以来的秒数除以二得出的数字。 - Daniel
谢谢您的观点!因此,“major.minor.build.revision”是有意义的,并回答了“为什么.NET中的System.Version被定义为Major.Minor.Build.Revision”的问题。 - hfrmobile
文档中说,“build”是对相同源代码的重新编译。这就是这个词的字面意思……它是建立的行为。只有在“revision”之后,才会有源代码的更改。它自动将构建用作日期,将修订版本用作午夜以来的秒数,这一事实使情况变得更加令人发狂。 - DAG

3

虽然晚了一些,但我觉得其他答案可以再详细阐述一下。

“构建”和“修订版”这些术语只是微软的用语。System.Version类不在乎你如何分配它们。

至于更改部件顺序以匹配您自己的术语,我认为您应该完全忽略这些单词,并考虑System.Version 真正定义的内容:

  • A string format that it can parse and generate:

    major.minor[.build[.revision]]
    

    This means that if you are used to having you own version formatted as x.y.z.w, then you should instantiate the Version class this way:

    new Version(x, y, z, w)
    

    Any other parameter order will not match what Parse() and ToString() would do. If you switch z and w, then ToString() would output x.y.w.z which would be confusing for everyone if you expect x.y.z.w.

  • A version comparison and sort order, whereby versions are sorted first by major, then by minor, then build, then revision, as most of us would expect. That is, 1.2.5 is later than 1.2.3.7.

    So if you style your version string as 1.2.6.4 and want that to be considered newer than 1.2.5.8, then do not switch the order of the parts in the Version constructor.

简而言之,虽然主要/次要/构建/修订这些词汇可能会提示应该增加哪个数字,但这些术语对类的实际使用几乎没有影响。格式和排序才是最重要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接