Esto hará el truco, y funcionar de una manera segura y segura. Por supuesto, depende de usted desechar los robots usted mismo, etc.Obviamente, no será eficiente para una gran cantidad de robots, pero hay muchas maneras de lidiar con eso.
public class Robot : IDisposable
{
private static List<bool> UsedCounter = new List<bool>();
private static object Lock = new object();
public int ID { get; private set; }
public Robot()
{
lock (Lock)
{
int nextIndex = GetAvailableIndex();
if (nextIndex == -1)
{
nextIndex = UsedCounter.Count;
UsedCounter.Add(true);
}
ID = nextIndex;
}
}
public void Dispose()
{
lock (Lock)
{
UsedCounter[ID] = false;
}
}
private int GetAvailableIndex()
{
for (int i = 0; i < UsedCounter.Count; i++)
{
if (UsedCounter[i] == false)
{
return i;
}
}
// Nothing available.
return -1;
}
Y algunos códigos de prueba para una buena medida.
[Test]
public void CanUseRobots()
{
Robot robot1 = new Robot();
Robot robot2 = new Robot();
Robot robot3 = new Robot();
Assert.AreEqual(0, robot1.ID);
Assert.AreEqual(1, robot2.ID);
Assert.AreEqual(2, robot3.ID);
int expected = robot2.ID;
robot2.Dispose();
Robot robot4 = new Robot();
Assert.AreEqual(expected, robot4.ID);
}
"Si luego destruyo el robot 2 y creo un nuevo robot más adelante, tendrá el ID de 2." Eso no suena como el concepto básico de autoincremento para mí. – BoltClock
¿Las instancias del robot persisten en algún almacén de datos? SQL Server, Access, etc. – Bryan