2016-02-21 161 views
2

我忙於c#的一個非常小的控制檯應用程序。我剛剛進入C#,我只熟悉Java。我的學校負責創建一個模擬汽車經銷商的控制檯應用程序。我已經寫了一堆代碼來通過控制檯添加汽車。品牌,類型和最高速度等已經實現。我唯一需要認識到的是汽車ID的自動創建和增量。它當然是獨一無二的。自動增量ID C#

我的第一種方法是使id字段靜所以每次該對象被創建的ID獲取++增加它在構造函數;

只見配發的人在做計算器的事情,但配發的解決方案,沒有工作或到哪裏大。

這是我的代碼;

class Car : Vehicle 
{ 
    public string brand { get; set; } 
    public string type { get; set; } 
    public int maxSpeed { get; set; } 
    public double price { get; set; } 
    public static 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++; 

    } 
} 

我在列表中添加了3輛車,但結果是所有的車都有ID 3;

也許有人可以幫助我,在此先感謝。

+2

靜態變量在類的所有實例之間共享。在構造函數中增加它使得爲該類創建的所有實例都使用相同的遞增值。 – Steve

+0

感謝您的快速和有用的答覆,但我的程序不需要concurrenc –

回答

1

只是爲了除去靜電,並添加鎖定部用於避免IDS

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; 
     } 
    } 
} 
+0

因此,每輛車都有ID 1代碼? –

+0

感謝您的快速和有效的答覆,但我的程序並不需要併發 –

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

+0

感謝您的快速和有用的回覆 –

+0

那麼,你不必擔心Interlocked.Increment或其他方式來防止併發修改靜態變量。上面的代碼應該像你期望的那樣工作 – Steve

2
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開始。

+0

我還有一個帶多個選項的開關盒,選項1:打印汽車,選項2添加汽車等等。當我通過在控制檯上鍵入1來打印汽車時,他用id 1 2 3打印了一切(我當然添加了3輛汽車)。當我再次打印它們時,獲得編號爲4,5和6的編號。怎麼會發生這種情況。我也嘗試過下面的解決方案,但沒有一個能夠取得成功 –