在对象上生成负ID并防止整数溢出

时间:2012-10-09 13:12:48

标签: .net vb.net integer overflow

我有一个对象,比如说Dog。对于每只狗,数据库生成唯一标识符 - ID。

但是在将DB保存在DB中之前,我应该生成一个临时的(负ID)。

所以,我在Class Dog中创建了一个共享(静态)_lastId = 0.

在Dog的构造函数中,我只减少lastId。

但是一旦我将狗保存在垃圾收集器中的数据库或狗“死亡”中,负面ID就不再用于该对象,因此可以被其他狗使用,这些狗还活着但没有保存。 / p>

因为max Integer = 2,147,483,647,如果我做了很多代表大型Dog的列表,我可能会超过整数的最大限制......

Private Shared _LastId = 0

Public Sub New()
  Me.Id = _LastId - 1

这里可以使用什么“回收”机制来防止溢出?

3 个答案:

答案 0 :(得分:1)

三个选项

1

使用Int64的单独TempID。

覆盖等于和==足够聪明以使用TempID或ID。

但是当对象获得真实ID时,不要更改哈希值。

2

或者使用Int64作为ID(临时和真实) 从积极的方面来说,你碰巧只使用Int32。

3

在Dog上实现Dispose并在那里返回-ID。

当狗获得正面ID时,返回-ID。

拥有已回收-ID的HashSet,并在获取新的-ID之前从该列表中获取。

答案 1 :(得分:0)

为什么不保留所有未保存的新对象的默认值为0? 或者甚至更好,使用像NHibernate或Entity框架这样的ORM来处理这个问题?

答案 2 :(得分:0)

一旦达到最低可能值,只需重置为-1即可满足您的需求:

Public Sub New()
    If _LastId > Interger.MinValue Then
        Me.Id = _LastId - 1
    Else
        Me.Id = -1
    End if
    ' ...