如何在 C#8 中使用 GUID
译文链接:https://www.infoworld.com/article/3539951/how-to-work-with-guids-in-csharp-8.html
在程序开发中经常会用到 GUID (全球唯一标志符) 的场景,GUID 就像数据库中的主键,它能够确保一些非常重要的信息,比如说:客户数据或发票不会出现重复或者数据被覆盖,如果没有GUID的话,你很难保证数据不丢失以及数据的完整性。
本质上来说,GUID就是一串很长的编号,这串编号从数学角度能够保证不仅仅在一个系统中是唯一的,而且在多系统甚至跨系统之间都是唯一的,这篇文章我们就来讨论一下为什么需要GUID,以及如何在 C#8 中使用 GUID。
要想运行本篇提供的例子,你需要安装 Visual Studio 2019
,如果没有的话,可以到官网去下载。
为什么要用 GUID
想象一下如果你有一个销售性质的app手机程序,它可以工作于离线和在线两种模式,假定你的程序所生成的订单ID是从1开始递增的,当你的应用程序在离线状态下生成了一些销售订单数据,一旦联网之后,这些重复的订单ID如何进行合并,不用想肯定会存在冲突的,对吧,所以你要做的事情就是完全做到订单ID的唯一性,而不是为了这个情况不得不写很多的代码来妥协。
接下来看一下 GUID 是如何解决这种问题的,GUID 是一个很长的编号,有128bit位,几乎可以说是独一无二的,这里我为什么要加上几乎
呢?虽然GUID是一个很长的编号,它的冲突微乎其微,但不代表这种可能性为 0 。
你可以把 GUID 作为你数据表的主键,这样你也不用怕当有多个 数据库 做合并的时候产生主键冲突,因为根本就不会发生,而且在 离线状态 下,你也可以大大方方的使用 GUID 来生成销售订单,不需要去连接什么内网和外网。
GUID 的组成分析
下面就是一个 GUID 的例子,值得注意的是 GUID 通常是128bit,为了方便阅读一般都用 16进制表示。
eaa24756-3fac-4e46-b4bb-074ff4f5b846
GUID 是一个约定为 32 个16进制组成的,这些16进制数字由 8-4-4-12
分四块进行编码的,大家可以仔细对照上面的GUID格式,因此最多有 2^128 个 GUID。
使用 C#8 生成GUID
这一部分将会学习如何使用 C# 创建 GUID,你可以使用 System 命名空间下的结构体 Guid,这是生成 Guid 最直接的一个方式,可以像下面代码那样在 Main 方法中生成GUID。
Guid obj = Guid.NewGuid();
Console.WriteLine("The newly created Guid is: " + obj.ToString());
Console.ReadKey();
使用 C#8 生成一个空的 GUID
因为GUID是一个结构体,所以它肯定是一个值类型,但是值类型你不可以给它设置为null,意思就是,如果你想生成一个空GUID,你可以如下这么写:
Guid id = new Guid();
if(id == Guid.Empty)
Console.WriteLine("The Guid is empty");
空的GUID的值是:00000000-0000-0000-0000-000000000000
,你可以利用这个值去判断另一个GUID 是否为空,对吧,代码如下:
if (guid != Guid.Empty){
//The GUID object contains non-zero values
}
else
{
//The GUID object is empty
}
下面我写了一个简单的扩展方法,用于判断指定的 GUID 是否为空。
public static bool IsNullOrEmpty(this Guid guid)
{
return (guid == Guid.Empty);
}
如果你想判断一个可空类型的GUID是否为null,可以用下面的扩展方法。
public static bool IsNullOrEmpty(this Guid? guid)
{
if (guid.HasValue)
if (guid == default(Guid))
return true;
return false;
}
值得注意的是,default(Guid) 和 Guid.Empty 两者是等价的。
C#8 中如何将 GUID 转为 string
你甚至可以将 GUID 转成一个 string 值,下面的代码片段展示了如何将一个 空GUID 转成 string 的过程。
string str = Guid.Empty.ToString();
Console.WriteLine(str);
在使用GUID 的过程中有一点要注意,你除了会遇到极小概率的冲突,更要注意的是GUID 会占用更多的存储空间和它的生成无序性,其实你也可以变通实现,比如使用两个 Ulong 总共128bit 并且有序的递增它实现一个编程性质的唯一GUID。
如果你想把 GUID 绑定到你的数据控件或者用户界面,你可以将 GUID 转成 String形式,甚至可以将 GUID 按照你的想要的格式进行 ToString。
你也可以通过其他的方式生成一个 GUID,比如说:随机数,基于时间,基于硬件,基于内容(比如:MD5,SHA-1),在后面的文章中我会带着大家用这些方法是去实现以及更多GUID的高级功能。