加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#类自动增量ID

发布时间:2020-12-15 18:24:07 所属栏目:百科 来源:网络整理
导读:我在C#中创建了一个名为“Robot”的类,每个机器人都需要一个唯一的ID属性,它给自己一个身份. 有没有办法为每个新的类对象创建一个自动增量ID?因此,如果我创建了5个新机器人,它们的ID将分别为1,2,3,4,5.如果我随后销毁机器人2并在以后创建新机器人,则其ID为2
我在C#中创建了一个名为“Robot”的类,每个机器人都需要一个唯一的ID属性,它给自己一个身份.

有没有办法为每个新的类对象创建一个自动增量ID?因此,如果我创建了5个新机器人,它们的ID将分别为1,2,3,4,5.如果我随后销毁机器人2并在以后创建新机器人,则其ID为2.如果我添加了6,它的ID为6,依旧等等.

谢谢.

解决方法

这将解决问题,并以一种良好的线程安全方式运行.当然,由你自己处理机器人等等.显然,对于大量的机器人来说它不会有效,但有很多方法可以解决这个问题.
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;
    }

还有一些测试代码可以很好地衡量.

[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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读