Номера версий с плавающей запятой, десятичные или двойные - PullRequest
9 голосов
/ 12 ноября 2010

У меня есть система управления документами, в которой документы могут иметь несколько версий.Каждая версия сохраняется, и пользователи могут просматривать историю версий.

Что я хотел бы знать: Какой тип данных я должен использовать для номеров версий?Десятичное число, число с плавающей запятой или двойное число? Я использую .NET и C #.

Номера версий начинаются с 0,1 , а каждая опубликованная основная версия будет округлена доследующий целый номер.то есть 0,4 переходит к 1,0 и 1,3 переходит к 2,0 и т. д.

Когда номер версии достигает 0.9 и добавлена ​​версия minor . Я бы хотел, чтобы число добавлялось к 0.10 , а не 1.0 .Это самая большая проблема.

Любые предложения приветствуются.

Спасибо.

Ответы [ 5 ]

17 голосов
/ 12 ноября 2010

System.Version

Здесь уже хранятся различные детали, речь идет о представлении его в виде строки (компоненты ревизии и сборки используются только при отображении, если они не равны нулю, поэтому их не имеет значения для вашего случая.не имеет значения) и (что лучше всего) уже понято другими разработчиками .NET и не приведет к путанице (если бы я увидел какое-то использование номера версии, который не был System.Version, я бы потратил некоторое времязатем пытаясь понять, почему Version не был достаточно хорош для работы, в случае, если это оказалось важным и спровоцировало неприятный сюрприз. Если это было достаточно хорошо для работы, я был бы раздражен тем, что разработчик тратит мое время, какэто).

Вы можете легко справиться со средствами, которые вы хотите увеличить с помощью методов расширения:

public static Version IncrementMajor(this Version ver)
{
  return new Version(ver.Major + 1, 0);
}
public static Version IncrementMinor(this Version ver)
{
  return new Version(ver.Major, ver.Minor + 1);
}
5 голосов
/ 12 ноября 2010

Как насчет двух целых чисел? Один для основных и один для небольших изменений?

2 голосов
/ 12 ноября 2010

Создайте свой собственный тип данных для этого

public struct VersionNumber : IComparable<ReleaseNumber>
{
  public int MajorVersion{get;set;}
  public int MinorVersion{get;set;}

  public VersionNumber( int major, int minor)
  {
    MajorVersion = major;
    MinorVersion = minor;
  }

  public override string ToString(){
    return major + '.' + minor;
  }

  public int CompareTo(VersionNumber other) {
    int result;
    result = MajorVersion.CompareTo(other.MajorVersion);
    if (result != 0) { return result; }
    return MinorVersion.CompareTo(other.MinorVersion);
  }
  public static bool operator <(VersionNumber left, VersionNumber right) {
    return left.CompareTo(right) < 0;
  }
  public static bool operator <=(VersionNumber left, VersionNumber right) {
    return left.CompareTo(right) <= 0;
  }
  public static bool operator >(VersionNumber left, VersionNumber right) {
    return left.CompareTo(right) > 0;
  }
  public static bool operator >=(VersionNumber left, VersionNumber right) {
    return left.CompareTo(right) >= 0;
  }
}

Вы также можете добавить компаратор, чтобы вы могли проверить два номера версий, чтобы увидеть, какая из них является наивысшей версией двух номеров версий, например.

EDIT

Добавлена ​​логика сравнения также для хорошей меры:)

1 голос
/ 12 ноября 2010

Десятичное число должно быть лучшим из приведенных выше, но, как другие отметили, лучше использовать два целых числа.

Двойные и плавающие значения не точно хранят все десятичные значения, вы не хотите, чтобы ваша версия внезапнобыть 1.219999999999999999

1 голос
/ 12 ноября 2010

Я бы предложил два целых числа: старшее и младшее. Вы даже можете сохранить это как major * 1000 + minor, если хотите одну переменную.

...