gpt4 book ai didi

vb.net - 在构造函数中自动生成唯一 ID

转载 作者:行者123 更新时间:2023-12-04 04:29:11 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

指导

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

Dim id As Guid = Guid.NewGuid()

您甚至可以将其保留为字符串:
Dim id As String = Guid.NewGuid().ToString("N")

这应该被授予在不同机器上是唯一的(以满足您的要求,即它必须适合用作数据库中的主键)。另见 this post .

时间戳

更糟糕的情况是,如果您没有如此严格的要求(跨网络的唯一性),您可以使用时间戳。当然,在这种情况下,你要考虑更多的问题:
  • 法定时间:时间每年往返两次。
  • Zones:如果用户在伦敦输入数据然后搬到纽约怎么办?
  • 并发性:您必须假设没有其他人将记录添加到您的数据库中(如果他们使用不同的技术,您可能会发生冲突)。如果执行是并发的(您的程序的多个实例一起运行),您也不能应用它。
  • 计时器粒度:系统日期的粒度较粗:如果您在短时间内构造了许多对象,那么您可能会有重复的 ID。 this post 中的解决方法.

  • 柜台

    如果满足所有这些条件:
  • 您的应用程序的多个实例不会并行运行。
  • 您正在一台计算机(不是网络)上工作。
  • 每次应用程序启动时数据库都是空的。

  • 您可以使用 Shared每次构造新对象时计数器都会递增。如果系统计时器粒度不是问题(请参阅有关时间戳的段落),您可以使用 system up time作为身份证。由于粒度的限制,即使同一应用程序的多个实例同时运行,它也应该可以工作。

    如果您使用 Shared您必须处理同步问题的字段。正如 this comment 中的建议您可以使用 SyncLock .作为替代方案,您可以使用 Interlocked.Increment手术。

    哈希码

    如果计数器的所有条件都满足并且这个条件也满足:
  • 您的应用程序是 32 位的。
  • 您的对象不是 ValueType它不会覆盖 GetHashCode()方法。

  • 您可以使用哈希码(通过 GetHashCode() 获得)因为(来自 MSDN):

    In other words, two objects for which the ReferenceEquals method returns true have identical hash codes.



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

    随机数

    我知道这可能会让某人感到震惊,但一个好的 64 位值随机数生成器发生冲突的概率非常低。我重复 非常非常低概率(参见 this article 了解更多数学细节)。只是不要使用 System.Random为了这!

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

    关于vb.net - 在构造函数中自动生成唯一 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21433670/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com