自动递增ID C#

时间:2016-02-21 18:13:03

标签: c# auto-increment

我忙于为c#设计一个非常小的控制台应用程序。我刚刚进入c#,我只熟悉Java。我的学校完成了创建一个模拟汽车经销商的控制台应用程序的任务。我已经写了一堆代码来通过控制台添加汽车。品牌和类型以及最高速度等内容已经实施。我唯一需要意识到的是汽车的自动创建和增量ID。它当然是独一无二的。

我的第一种方法是将id字段设置为static并在构造函数中递增它,这样每次创建对象时id都会得到++;

我看到有很多人在stackoverflow上做了很多事情,但是解决方案没有用,或者在哪里做大。

这是我的代码;

{{1}}

我在列表中添加了3辆车,但结果是所有车辆都有ID 3;

也许有人可以帮助我,提前谢谢。

3 个答案:

答案 0 :(得分:3)

class Car : Vehicle
{
    public string brand { get; set; }
    public string type { get; set; }
    public int maxSpeed { get; set; }
    public double price { get; set; }
    public int carID { get; private set; }

    public static int globalCarID;



    public Car(string _brand, string _type, int _maxspeed, double _price)
    {
        this.brand = _brand;
        this.type = _type;
        this.maxSpeed = _maxspeed;
        this.price = _price;
        this.carID = Interlocked.Increment(ref globalCarID);
    }
}

这维护了一个全局ID计数器,并以原子方式递增它以使其成为线程安全的。

请注意,以这种方式分配的第一个ID为1.您可以使用-1初始化globalCarID以从0开始。

答案 1 :(得分:1)

仅删除静态并添加锁定部分以避免重复ID

class Car : Vehicle
{
    private static object sync = new object();
    private static int _globalCount;
    public string brand { get; set; }
    public string type { get; set; }
    public int maxSpeed { get; set; }
    public double price { get; set; }
    public int carID { get; set; }



    public Car(string _brand, string _type, int _maxspeed, double _price)
    {
        this.brand = _brand;
        this.type = _type;
        this.maxSpeed = _maxspeed;
        this.price = _price;
        lock (sync)
        {
         this.carID = ++globalCount;
        }
    }
}

答案 2 :(得分:0)

静态变量在类的所有实例之间共享 在构造函数中递增它会使该类的所有实例“看到”分配给静态变量的最后一个值。

您应该创建一个普通的实例carID变量(不是静态的)并使用基类中定义的受保护的静态变量来获取构造函数时的当前值,分配给您的carID实例变量然后增加基数阶级价值。

class Vehicle
{
    protected static int FakeID = 1;
}

class Car : Vehicle
{
    public string brand { get; set; }
    public string type { get; set; }
    public int maxSpeed { get; set; }
    public double price { get; set; }
    public int carID { get; set; }

    public Car(string _brand, string _type, int _maxspeed, double _price)
    {
        this.brand = _brand;
        this.type = _type;
        this.maxSpeed = _maxspeed;
        this.price = _price;
        this.carID = base.FakeID++;;

    }
}

void Main()
{
    Car a = new Car("xyz", "Auto", 120, 12000);
    Car b = new Car("kwx", "Moto", 180, 8000);

    Console.WriteLine(a.carID);
    Console.WriteLine(b.carID);
}

请记住,如果您的代码不使用对构造函数的多线程访问,这将正常工作。如果是多线程,您需要查看Interlocked.Increment