热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在C#8中使用GUID

如何在C#8中使用GUID-译文链接:https:www.infoworld.comart在程序开发中经常会用到GUID(全球唯一标志符)的场景,GUID就像数据库中的主键,
译文链接:https://www.infoworld.com/art...

在程序开发中经常会用到 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的高级功能。

更多高质量干货:参见我的 GitHub: dotnetfly

推荐阅读
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • WPF开发心率检测大数据曲线图的高性能实现方法
    本文介绍了在WPF开发中实现心率检测大数据曲线图的高性能方法。作者尝试过使用Canvas和第三方开源库,但性能和功能都不理想。最终作者选择使用DrawingVisual对象,并结合局部显示的方式实现了自己想要的效果。文章详细介绍了实现思路和具体代码,对于不熟悉DrawingVisual的读者可以去微软官网了解更多细节。 ... [详细]
  • 最近在使用C#进行录屏,通过调用ffmpeg的cmd命令进行录制。设置的录制时长是30秒,但实际只录制了11秒就停止了。关闭程序后,又开始录制并成功录制了30秒。请问大神,这是什么原因?附上了简单的调用程序。 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
author-avatar
传闻中的张先生
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有