应用中为了对多个不同类的实例进行维护使其具有唯一标识创建以下标识符类:
/// <summary>
/// 本类适用于为某类对象维护唯一标识(int),标识从1开始,只允许赋值一次,/// 赋值时如果值已经被其它对象使用,那抛出异常。
/// </summary>
/// <typeparam name="T">需要维护唯一标识的类</typeparam>
public class ObjectId<T>:IDisposable
{
static List<int> usedIds = null;
public ObjectId()
{
m_Id=0;
m_IdSeted = false;
}
public void Dispose()
{
usedIds.Remove(m_Id);
}
static ObjectId()
{
usedIds = new List<int>();
usedIds.Add(0);
}
int m_Id;
bool m_IdSeted;//id一次赋值后不得再次更改
public int ID
{
get { return m_Id; }
set
{
if (value == 0)
value = GetNewId();
if (usedIds.Contains(value))
throw new Exception("ID:" + value.ToString() + "重复");
if (m_IdSeted && value == m_Id)
throw new Exception("ID赋值后不能改变");
m_Id = value;
usedIds.Add(m_Id);
m_IdSeted = true;
}
}
static object locker = new object();
public static int GetNewId()
{
lock (locker)
{
for (int i = 0; i < int.MaxValue; i++)
{
if (!usedIds.Contains(i))
{
return i;
}
}
}
throw new Exception("Id分配完了!");
}
public static implicit operator int(ObjectId<T> idObj)
{
return idObj.ID;
}
public static implicit operator ObjectId<T>(int id)
{
ObjectId<T> idObj = new ObjectId<T>();
idObj.ID = id;
return idObj;
}
}
但由于继承了IDisposable接口,导致被使用的类也需要手动释放资源,造成使用上的不便,暂时还没有找到好的办法解决。先标记留待今后完善。