एक स्थिर आवृत्ति चर बनाएँ, और 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
क्या कुछ डेटा स्टोर में रोबोट के उदाहरण बने रहे हैं? एसक्यूएल सर्वर, एक्सेस, आदि – Bryan