我忙于为c#设计一个非常小的控制台应用程序。我刚刚进入c#,我只熟悉Java。我的学校完成了创建一个模拟汽车经销商的控制台应用程序的任务。我已经写了一堆代码来通过控制台添加汽车。品牌和类型以及最高速度等内容已经实施。我唯一需要意识到的是汽车的自动创建和增量ID。它当然是独一无二的。
我的第一种方法是将id字段设置为static并在构造函数中递增它,这样每次创建对象时id都会得到++;
我看到有很多人在stackoverflow上做了很多事情,但是解决方案没有用,或者在哪里做大。
这是我的代码;
{{1}}
我在列表中添加了3辆车,但结果是所有车辆都有ID 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