我有一个对象,比如说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
这里可以使用什么“回收”机制来防止溢出?
答案 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
' ...