代码之家  ›  专栏  ›  技术社区  ›  cjk

更改枚举的编号是否为中断更改?

  •  7
  • cjk  · 技术社区  · 15 年前

    考虑以下代码:

    public enum SomeCode
    {
         NIF = 0
        ,NIE = 1
        ,CIF = 2
        ,PAS = 3
        ,NIN = 4
        ,SSN = 5
        ,OTH = 5
        ,UKN = 6
    }
    

    将改变 OTH = 5 OTH = 7 是一个突破性的改变?


    编辑:我从不存储int值,只存储枚举的文本表示形式。它可以在其他DLL中使用,但将使用相同的存储。

    6 回复  |  直到 12 年前
        1
  •  12
  •   Oded    15 年前

    这是一个突破性的更改,因为您正在更改公共API。

    使用旧值构建的库/应用程序仍将保留旧值并使用它。您将需要重新编译它们。

    从MSDN- enum (C# Reference) :

    与任何常量一样,对枚举单个值的所有引用在编译时都转换为数字文本。这可以创建常量(C编程指南)中描述的潜在版本控制问题。

        2
  •  3
  •   Ray Hayes    15 年前

    这取决于您是否能够控制解决方案的完整代码,或者您是否正在导出一个库以供其他人使用。

    • 也许不是 如果 全部的 以下是真的
      • 如果只是你自己用的话
      • 你重建一切
      • 您只使用枚举
      • 您不需要在数据库中存储顺序(强制转换为顺序或从顺序转换为顺序)。
    • 是的 如果以下任何一项为真
      • 如果其他人正在使用您的库,并且没有重新编译,也没有使用特定于版本的引用(假设您正在增加构建版本)或签名的引用。另一个代码将保存它自己的序数值副本,但现在不匹配。
      • 对序数值使用显式强制转换
      • 您序列化数据并希望使用旧的“保存文件”

    有类似的gotchas与公开的consts。

    一般来说,假设是的——这是一个突破性的变化!

        3
  •  2
  •   Kangkan    15 年前

    它会的。假设您将一些数据存储为枚举中的int,那么将来检索这些数据将产生错误的结果。在这种情况下,在更改之前为OTH存储的数据不会像您当前为OTH存储的5个数据一样显示为OTH,将来您将获得5个数据,同样需要7个数据。

        4
  •  2
  •   Jon Hanna    15 年前

    如果没有人依赖于它的值为5,这不是一个破坏性的变化,但是值得注意的是,任何使用它的人都依赖于它的值为5,即使这在他们的代码中不是明确的。

    如果我针对这个程序集编写代码,比如:

    if(myVal == SomeCode.OTH)
    {
        //do something
    }
    

    然后在内部将其与5的值进行比较。即使数字5没有出现在我的源代码中的任何地方,所以如果我部署程序集的新版本,它将被破坏。

    保存的宽限期是,我不需要重新编写来处理这个破坏性的更改,只需要重新编译。

        5
  •  0
  •   akapoor    15 年前

    首先,ssn和oth均为5,是否输入错误?否则,对于使用此枚举的switch语句,它是编译时错误? 现在,将oth=5更改为oth=7,如果将枚举用作 SomeCode someCode = (SomeCode)5 .

        6
  •  0
  •   Felix Ungman    15 年前

    这要看情况而定。只有当您能够验证noone的值是否为5或与ssn相同,或者您能够重构掉这样的依赖关系时,这才是一个不间断的更改。