應用中爲了對多個不同類的實例進行維護使其具有唯一標識創建以下標識符類:
/// <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接口,導致被使用的類也需要手動釋放資源,造成使用上的不便,暫時還沒有找到好的辦法解決。先標記留待今後完善。