Создайте переменную статического экземпляра и используйте на нем Interlocked.Increment(ref nextId)
.
class Robot {
static int nextId;
public int RobotId {get; private set;}
Robot() {
RobotId = Interlocked.Increment(ref nextId);
}
}
Примечание # 1: с помощью nextId++
будет действительна только в неконкурирующих средах; Interlocked.Increment
работает, даже если вы выделяете своих роботов из нескольких потоков.
EDIT Это не касается повторного использования идентификаторов роботов. Если вам нужно повторное использование, решение намного сложнее: вам нужен список многоразовых идентификаторов и ReaderWriterLockSlim
вокруг кода, который обращается к этому списку.
class Robot : IDisposable {
static private int nextId;
static private ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();
static private IList<int> reuseIds = new List<int>();
public int RobotId {get; private set;}
Robot() {
rwLock.EnterReadLock();
try {
if (reuseIds.Count == 0) {
RobotId = Interlocked.Increment(ref nextId);
return;
}
} finally {
rwLock.ExitReadLock();
}
rwLock.EnterWriteLock();
try {
// Check the count again, because we've released and re-obtained the lock
if (reuseIds.Count != 0) {
RobotId = reuseIds[0];
reuseIds.RemoveAt(0);
return;
}
RobotId = Interlocked.Increment(ref nextId);
} finally {
rwLock.ExitWriteLock();
}
}
void Dispose() {
rwLock.EnterWriteLock();
reuseIds.Add(RobotId);
rwLock.ExitWriteLock();
}
}
Примечание # 2: Если вы хотите повторно использовать меньшие идентификаторы впереди больших идентификаторов (в отличие от повторного использования идентификаторов, выпущенные ранее, прежде чем идентификаторы выпущенных позже, как я закодировал) вы можете заменить IList<int>
с SortedSet<int>
и сделать несколько корректировок вокруг частей, где идентификатор, который будет использоваться повторно, берется из коллекции.
«Если я затем уничтожу робота 2 и создаю новый робот позже, он будет иметь идентификатор 2.» Это не похоже на базовую концепцию автоинкремента для меня. – BoltClock
Являются ли экземпляры роботов постоянными в каком-то хранилище данных? SQL Server, Access и т. Д. – Bryan