我有一个文档管理系统,其中文档可以有多个版本。每个版本都会被保存下来,并且用户可以查看版本历史。
我想知道的是:在.NET和C#中,我应该使用什么数据类型来表示版本号?Decimal、Float还是Double?
版本号从0.1开始,每次发布主要版本时,版本号将四舍五入为下一个整数。例如,0.4变成1.0,1.3变成2.0等。
当版本号达到0.9并添加了次要版本时,我希望数字变成0.10而不是1.0。这是最大的问题。
欢迎提出任何建议。
谢谢。
我有一个文档管理系统,其中文档可以有多个版本。每个版本都会被保存下来,并且用户可以查看版本历史。
我想知道的是:在.NET和C#中,我应该使用什么数据类型来表示版本号?Decimal、Float还是Double?
版本号从0.1开始,每次发布主要版本时,版本号将四舍五入为下一个整数。例如,0.4变成1.0,1.3变成2.0等。
当版本号达到0.9并添加了次要版本时,我希望数字变成0.10而不是1.0。这是最大的问题。
欢迎提出任何建议。
谢谢。
System.Version
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);
}
两个整数怎么样?一个用于主要修订版本,另一个用于次要修订版本?
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;
}
}
编辑
为了保险起见,也添加了比较器逻辑 :)
major * 1000 + minor
。十进制应该是以上所述中最好的选择,但正如其他人指出的那样,两个整数可能更好。
双精度和浮点数不能准确地存储所有十进制值,您不希望您的版本突然变成1.219999999999999999。
IncrementMinor
时将ver.Minor
设置为int.MaxValue
会发生什么吗?这将取决于checked
或unchecked
上下文,你可能会收到溢出错误或它会更改为int.MinValue
。编译以上代码时,将其设置为checked
(默认值)以确保异常发生是个好主意。 - Jon Hanna