在构造函数中自动生成唯一 ID

2024-03-16

使用 VB.net 创建一个名为 Staff 的新类,它具有三个属性: Name 、 LastName、ID - 应适合用作数据库中的主键。

提供类构造函数来填充 Name 和 LastName。 ID 应在构造函数内自动生成,不应传入。

我知道如何创建类、属性和构造函数,我只需要知道如何在构造函数中自动生成 ID 字段。是否有可能做到这一点?

我通常做的是将数据库中的 id 字段设置为身份字段和主键,以便它自动插入下一个可用的 id,或者在我的应用程序中,我从数据库中读取最后一个 ID 并向其添加一个。但我需要知道如何在构造函数中自动生成 ID 字段。


Guid

如果您对 ID 类型没有任何限制,则可以使用 GUID:

Dim id As Guid = Guid.NewGuid()

您甚至可以将其保留为字符串:

Dim id As String = Guid.NewGuid().ToString("N")

这应该被认为在不同的机器上是唯一的(以满足您的要求,它必须是适合用作数据库中的主键)。也可以看看这个帖子 https://stackoverflow.com/questions/10951828/is-it-safe-to-assume-boostuuid-wont-return-a-duplicate/10951940#10951940.

时间戳

更糟糕的情况是,如果您没有如此严格的要求(整个网络的唯一性),您可以使用时间戳。当然,在这种情况下,你还要考虑更多的问题:

  • 法定时间:时间每年往返两次。
  • 区域:如果用户在伦敦输入数据然后搬到纽约怎么办?
  • 并发性:您必须假设没有其他人向您的数据库添加记录(如果他们使用不同的技术,您可能会发生冲突)。此外,如果执行是并发的(程序的多个实例一起运行),则不能应用此功能。
  • 计时器粒度:系统日期的粒度较粗:如果您在短时间内构造了许多对象,则可能会出现重复的 ID。解决方法在这个帖子 https://stackoverflow.com/questions/1416139/how-to-get-timestamp-of-tick-precision-in-net-c.

Counter

如果满足所有这些条件:

  • 应用程序的多个实例不会并行运行。
  • 您正在一台计算机(而不是网络)上工作。
  • 每次应用程序启动时,数据库都是空的。

您可以使用Shared每次构造新对象时计数器都会递增。如果系统计时器粒度不是问题(请参阅有关时间戳的段落),您可以使用系统正常运行时间 https://stackoverflow.com/questions/972105/retrieve-system-uptime-using-c-sharp作为身份证。由于粒度的限制,即使同一应用程序的多个实例同时运行,它也应该可以工作。

如果您使用Shared您必须处理同步问题的领域。正如建议的这条评论 https://stackoverflow.com/questions/21433670/auto-generate-unique-id-within-the-constructor-in-vb-net/21433768#comment32338574_21433768你可以使用SyncLock。作为替代方案,您可以使用Interlocked.Increment手术。

哈希码

如果计数器的所有条件都满足,并且该计数器也满足:

  • 您的应用程序是 32 位的。
  • 你的对象不是ValueType并且它不会覆盖GetHashCode() method.

您可以使用哈希码(通过以下方式获得)GetHashCode())因为(从MSDN http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx):

换句话说,ReferenceEquals 方法返回 true 的两个对象具有相同的哈希码。

Because Object.ReferenceEquals()回报true仅当您比较相同的实例时,每个实例才会有唯一的哈希代码(因为在 32 位应用程序中,哈希代码是对象引用本身)。请注意,这是一个实现细节,可能会发生变化。

随机数

我知道这可能会让某些人感到震惊,但是一个好的 64 位值随机数生成器发生冲突的可能性非常低。我重复非常非常低概率(见本文 http://en.wikipedia.org/wiki/Birthday_paradox#Approximation_of_number_of_people了解更多数学细节)。只是不使用System.Random为了这!

根据您使用的种子,您也可以在网络场景中生成随机数(不要忘记 - 需要引用 - 一个本地网络协议的早期草案提出了 32 位随机数作为地址,它已被更改,因为用户的反馈不好,但这并不意味着它不能工作)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在构造函数中自动生成唯一 ID 的相关文章

  • 如何在单独的线程上设置全局键盘挂钩?

    经过多次搜索后 我最终使用此类进行全局键盘挂钩 关联 全球挂钩柱 http sim0n wordpress com 2009 03 28 vbnet keyboard hook class Imports System Runtime In
  • document.readyState == "complete" 始终为 false。状态始终是“交互的”

    我正在 Page Load 上连接一个启动脚本 JavaScript 函数来触发 如下所示 ScriptManager RegisterStartupScript Me GetType Page page init page init Tr
  • STL容器如何复制对象?

    我知道 STL 容器 比如vector添加对象时复制该对象 push back方法如下 void push back const T x 我很惊讶地发现它把该项目作为参考 我编写了一个示例程序来看看它是如何工作的 struct Foo Fo
  • 从字符串“”到类型“布尔”的转换无效

    我在 ASP NET 登录表单的标题中收到错误消息 有谁知道我该如何解决它 非常感谢帮助 Protected Sub Button1 Click ByVal sender As Object ByVal e As EventArgs Han
  • 是否可以强制 Visual Studio 2010 使用 Visual Basic 10?

    要重现我收到的错误 在 Visual Basic 中创建一个新的 Visual Studio 2010 ASP NET 网站 面向 NET 2 0 输入 公共财产测试作为字符串 请注意 Visual Basic 9 0 不支持自动实现的属性
  • C# vb:S​​ystem.Func 占用多少内存?

    System Func 究竟拥有多少内存 System Func 是 1 行还是 1000 行有什么区别吗 Func是委托类型 一个实例在x86抖动中占用32字节存储 对象头 8 个字节 4 个字节用于 Delegate methodBas
  • vb.net 从数组中删除第一个元素

    一种答案是创建一个短一个元素的新数组 还有其他更简单的方法可以做到这一点吗 您可以使用 LINQ 以非常简洁的代码生成结果 Dim a2 a Skip 1 ToArray 批评者可能会说这很慢 您应该使用Array Copy反而 Dim a
  • 带有 case OR 运算的 VB.NET select case 语句逻辑是什么?

    我正在使用一个Or https msdn microsoft com en us library 06s37a7f aspx我的案例表达式中的声明 尽管我有一个在此范围内的值 但它没有找到匹配项 为什么不 示例代码 Select Case
  • Visual Studio 将 1.1 扩展为 1.1000000000000001

    至少对我来说 这是有史以来最奇怪的 Visual Studio 2010 行为 我正在开发 MVC3 项目 我从另一个项目 也包括 VS2010 MVC1 如果重要的话 复制了一行代码 如下所示 target height height 1
  • 只允许在 datagridview 单元格中键入一些字符

    有没有办法只将某些字符添加到 datagridview 单元格中 像 1234567890 据我所知 您可以使用两种方法来实现此目的 第一个 我认为最好的 是使用 CellValidating 事件DataGridView并检查输入的文本是
  • Razor 视图中的内联 If

    在我的控制器中 我有内联 If 语句 ViewBag NameSortParam If String IsNullOrEmpty sortOrder Name desc 在我看来 如果出现以下情况 我似乎无法使用内联 Code If Tru
  • 重写继承的构造函数字段时的差异?

    考虑这个简单的 Scala 类 class A val d Int Scala 之间是否存在差异 无论是行为还是生成的字节码 class B d Int extends A d and class B override val d Int
  • 多线程应用程序的调用方法?

    我的应用程序中有一个错误 与here http forums ni com t5 Measurement Studio for NET Waveform Graph quot X quot Error m p 217817 highligh
  • 是什么使得 java 中的枚举不可实例化?

    我知道一个枚举 enum Year First Second Third Fourth 被转换成 final class Year extends Enum
  • 如何阻止访问任何文件或exe vb.net?

    如何阻止和取消阻止文件或可执行文件在 vb net 运行时永久打开 您可以使用此代码 并且可以使用Environment UserName获取用户名 这将锁定任何类型的文件 也将锁定文件夹 Dim FSS As FileSystemSecu
  • 将读取器项目存储在数组中

    Dim myReader As OleDbDataReader Dim Index As Integer Dim status As Array Index 0 cmd CommandText SELECT CPALLOCATIONTIME
  • 将图像文件从网址复制到本地文件夹?

    我有该图像的网址 例如 http testsite com web abc jpg http testsite com web abc jpg 我想将该 URL 复制到 c images 中的本地文件夹中 而且当我将该文件复制到文件夹中时
  • System.IO.Compression 和 ZipFile - 提取并覆盖

    我使用标准 VB NET 库来提取和压缩文件 它也可以工作 但是当我必须提取并且文件已经存在时 问题就出现了 我使用的代码 Imports Imports System IO Compression 崩溃时我调用的方法 ZipFile Ex
  • 如何在 ASP.NET 中检查用户是否在线?

    该网站 最后活动 1 分钟前来自此 IP 地址 背后的逻辑是什么 如果您在隐藏字段中获取用户的 IP 地址 我该如何在 vb net 中执行此操作 我如何查看有多少用户在线使用该应用程序 ASP NET 会员服务支持此功能 要获取特定用户的
  • Ruby 对象打印为指针

    我正在尝试创建一个类 它有一个带有单个参数的构造函数 当我创建该对象的新实例时 它返回一个指针 class Adder def initialize my num my num my num end end y Adder new 12 p

随机推荐

  • Ruby on Rails:有哪些可用的报告和/或图表工具? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我刚刚开始使用 Ruby Rails 想知道 Rails 开发人员使用什么在 Rails 站点上提供报告
  • 结束对话 C# 机器人

    我正在用 C 构建一个聊天机器人 我希望在一些消息之后对话停止 但我不知道该怎么做 我已经设置了消息限制 并且我希望在达到此限制后不能再发送消息 有我的代码 private int NombreDeMessages protected ov
  • 是否有通用 I2C 命令来查看设备是否仍然存在于总线上?

    是否有通用的 I2C 命令来查看设备在初始化一次后是否仍然存在于总线上 例如 OLED 显示器 我问这个的原因是为了避免主程序由于库代码中存在无限循环而冻结 当设备断开连接时 例如 Wire 库 在 MCU 启动时 我想检查设备是否可用 并
  • python3请求使用quote而不是quote_plus

    我使用 Python 3 和requests http docs python requests org en master 用于查询 REST 服务的模块 库 看来请求默认使用urllib parse quote plus 对于 urle
  • 在后台接收蓝牙管理器通知

    我在我的应用程序中使用BluetoothManager私有框架 我想知道当应用程序处于后台时如何接收BluetoothManager通知 例如 在后台接收连接 断开连接的蓝牙通知 提前致谢 Use global notification e
  • 在 GridView 中通过分页维护排序

    我目前正在尝试编写代码 以便在更改 GridView 上的页面时保持排序首选项 我当前的代码运行良好 可以根据用户的排序选择对数据进行排序 但是当换页时 排序不起作用 我没有收到错误 而是收到未排序的结果 这是我的 aspx 代码
  • 如何使用sequelize 与postgres 进行日期比较

    我想删除日期在 20 分钟之前的所有记录 Postgres 或 Sequelize 对裸露的 javascript 不满意Date我提供的对象作为比较值 我在 postgres 9 6 数据库之上使用sequelize 4 37 有问题的列
  • Flask AttributeError:“HTMLString”对象没有属性“__call__”

    我创建了一个宏来处理表单错误 如下所示 macro render field with errors field p field label field kwargs safe if field errors p ul for error
  • R:如何将移动平均值应用于数据框中的列子集?

    我有一个数据框 training set 其中包含 83 个变量的 150 个观察值 我想用一些移动平均线来转换其中 82 个列 问题是结果最终只有 150 个数值 即 1 列 如何在数据中的每一列中单独应用移动平均函数并保持第 83 列不
  • “您的设备与此版本不兼容”

    我在 Play 商店中放置了一个应用程序 而我的朋友 在两台设备上运行 4 0 3 在尝试安装我的应用程序时收到以下消息 您的设备与此版本不兼容 一台设备允许安装 而另一台设备则不允许 我允许 API 3 15 并且两台设备都是 4 0 3
  • 向量子集性能:名称与索引

    如果我有一个向量v姓名 John Murray Lisa Mike Joe Ann 0 0832090 0 0475580 0 2797860 0 1086225 0 0104590 0 0028250 时间复杂度是多少v Joe vers
  • 如何将PHP编译成操作码并在生产环境中运行?

    注意 这不是facebook最近的hiphop项目 我只是想把它转换成opcode not c c 现在还有解决办法吗 演示永远是最好的 您正在寻找的是PHP加速器 http en wikipedia org wiki PHP accele
  • 创建 Dockerfile - docker 在每个新构建上从头开始

    我正在尝试构建一个 dockerfile 迭代地添加行和测试 我的理解是 docker 将缓存已经构建的行 并从我添加的新行开始 情况似乎是 每次我在容器上调用 build 时 它只是从头开始构建 这是正常的吗 如果不是 我做错了什么 正如
  • REngine”不包含“SetDllDirectory”、“RDotNet”的定义

    My Code using System using System Collections Generic using System ComponentModel using System Data using System Drawing
  • Android 通过按钮打开相机

    我希望这不是一个重复的问题 但我正在制作一个应用程序 我想要一个按钮来打开相机应用程序 单独的默认 Android 相机 我怎样才能做到这一点 我知道有一个功能 intent setAction MediaStore ACTION IMAG
  • 在 Big Query 上向表中插入数据时出现 IO 异常

    我正在尝试在大查询的表中插入数据 我遵循了一些文档 我的最终代码如下所示 HttpTransport TRANSPORT new NetHttpTransport JsonFactory JSON FACTORY new JacksonFa
  • 如何使用jquery放大图像

    我只是想知道如何使用 jquery 放大图片 像这个网站这样的东西 当您单击大图像时 它会放大 您可以移动光标并在放大时查看图片的其他部分 如果有人可以向我展示链接或将我引向正确的方向 我将不胜感激 它们不会放大 真正发生的是 当您单击 缩
  • lua多重赋值

    lua中是否有任何多重赋值的方法 使得右侧缺失的值不被视为nil 类似于 a b c 1 但得到 a 1 b 1 c 1 结果 很遗憾 a b c 1 不起作用 我需要这个 因为我可能在右侧有复杂的表格 并且我想保持它简短 没有任何附加变量
  • C++ 中的结构继承

    Can a struct在C 中可以继承吗 Yes struct完全就像class除了默认的可访问性是public for struct 虽然它是private for class
  • 在构造函数中自动生成唯一 ID

    使用 VB net 创建一个名为 Staff 的新类 它具有三个属性 Name LastName ID 应适合用作数据库中的主键 提供类构造函数来填充 Name 和 LastName ID 应在构造函数内自动生成 不应传入 我知道如何创建类