2011-11-10 53 views
4

這是使用恩斯姆的好例子嗎? 或者使用數組會更好嗎? 這裏的價值觀不會改變,也許每年說一次。這是Enums的正確使用嗎?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 

public enum transmission 
{ 
    Manual, 
    NonSynchronous, 
    Automatic, 
    SemiAutomatic, 
    Continuously, 
    Infinitely, 
    Electric, 
    Hydrostatic, 
    Hydrodynamic, 
} 

public enum bodystyle 
{ 
    Convertable, 
    Hatchback, 
    Sports, 
    Sedan 
} 
public enum carcolors 
{ 
    Red, 
    Blue, 
    Yellow, 
    White, 
    Black, 
    Green 
} 
public enum fueltype 
{ 
    Biofuels, 
    FossilFuels, 
    Nuclear, 
    Fission, 
    Fusion 
} 

public class Car 
{ 
     public Car(String cName, double cMaxSpeed, String cTransmission, String cBodystyle, String cColors, String cFueltype) { 
     carname = cName; 
     transmission = cTransmission; 
     bodystyle = cBodystyle; 
     colors = cColors; 
     fueltype = cFueltype; 
     maxspeed = cMaxSpeed; 
    } 
    public string carname 
    { 
     get; 
     set; 
    } 
    public string transmission 
    { 
     get; 
     private set; 
    } 
    public string bodystyle 
    { 
     get; 
     private set; 
    } 
    public string colors 
    { 
     get; 
     private set; 
    } 
    public string fueltype 
    { 
     get; 
     private set; 
    } 

    public void carInfo() 
    { 
     Console.WriteLine("------------------------------------"); 
     Console.WriteLine("Car Name:   " + this.carname); 
     Console.WriteLine("Car Transmission: " + this.transmission); 
     Console.WriteLine("Car Bodystyle: " + this.bodystyle); 
     Console.WriteLine("Car Colors:  " + this.colors); 
     Console.WriteLine("Car Fueltype:  " + this.fueltype); 
     Console.WriteLine("Car MaxSpeed:  " + this.maxspeed); 
     Console.WriteLine("------------------------------------"); 

    } 


} 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     Car nissan = new Car("Lamborgini", 255, Convert.ToString(transmission.Automatic), Convert.ToString(bodystyle.Sports), Convert.ToString(carcolors.Red), Convert.ToString(fueltype.Biofuels)); 
     nissan.carInfo(); 
    } 
} 

} 
+0

如果您的標題與您的問題內容相符,這將有助於提高答案的質量。標題詢問這是否是正確的用法,問題不在於,問題是否這是最佳的操作方法與查詢列表,這是有爭議的。 –

回答

4

您已經定義了幾個Enum類型,但實際上並未使用它們。所以,在這方面,不是一個正確的用法。

關於使用一個數組 - 我沒有看到對枚舉的價值。

傳入的類型都是string,而不是Enum類型,因爲屬性的類型也是如此。

一個適當的使用看起來像:

public enum BodyStyle 
{ 
    Convertable, 
    Hatchback, 
    Sports, 
    Sedan 
} 

public class Car 
{ 
    public Car(String cName, BodyStyle cBodyStyle) 
    { 
    carname = cName; 
    this.BodyStyle = cBodyStyle; 
    } 


    public string carname 
    { 
     get; 
     set; 
    } 

    public BodyStyle BodyStyle 
    { 
     get; 
     private set; 
    } 
} 
+2

這不應該是一個評論? –

+0

@PaulJackson:爲什麼這是一個評論?這是一個簡短的答案,但它是正確的。 –

+0

@JamesJohnson這不是一個答案,這是一個觀察。 –

2

的問題將是,爲了改變它們將需要重新編譯。這個應用程序還有什麼功能?這些值可以存儲在數據庫中嗎?這將使更新更簡單,並且您可以在不重新編譯應用程序的情況下進行更新。

+1

對於另一種觀點,http://thedailywtf.com/Articles/Soft_Coding.aspx – dsolimano

+0

我想我已經閱讀過那篇文章,如果它是我正在考慮的那篇文章。 「軟編碼地獄」。確實,你可以通過遍佈整個地方的數據定義來破壞一個完全可讀的程序。但是,有時編譯代碼並將其部署到產品環境中可能會很麻煩,因爲對數據庫或配置文件進行快速更新會更簡單。 – kevingreen

+0

確實。但是另一方面,當我沒有像代碼版本一樣認真和質量保證的時候,我已經搞糟了許多產品環境,並對數據庫進行了快速更新。 – dsolimano

0

問題是,當他們改變你將不得不修改,編譯,測試和發佈你的代碼。我會建議,如果有可能改變,然後將它存儲在可以在運行時配置的地方,例如數據庫或配置文件。

0

不,我將與他們應該代表像這樣枚舉聲明屬性:

public transmission transmission { get; private set; } 
0

它看起來並不像你所使用的枚舉在你的代碼。屬性類型應該與您創建的枚舉相對應:

public bodystyle BodyStyle { get; set; } 
0

您列出的枚舉實際上更適合作爲數據並加載(數組,字典等)。

枚舉的優點在於它們實際上是數值,所以如果您需要對任何值進行顯式測試,則應該使用TT模板來從數據生成枚舉。

基本上,如果不使用它們(即值測試)編程那麼他們也有可能不是真正的枚舉:)

0

我不這麼認爲。

你正在反對什麼是枚舉。我認爲Enum是一個整型常量族;您將它用作恰好轉換爲特定字符串的對象。

0

我不明白你爲什麼聲明枚舉,而只使用它們的字符串組件。在這種情況下,你也可以使用字符串數組。

如果你想使用枚舉(當然這種情況是合適的),你可以這樣做:

public Car(String cName, double cMaxSpeed, transmission cTransmission, bodystyle cBodystyle, carcolors cColors, fueltype cFueltype) { 
     carname = cName; 
     transmission = cTransmission; 
     bodystyle = cBodystyle; 
     colors = cColors; 
     fueltype = cFueltype; 
     maxspeed = cMaxSpeed; 
    } 

    public transmission transmission 
    { 
     get; 
     private set; 
    } 
    public bodystyle bodystyle 
    { 
     get; 
     private set; 
    } 
    public carcolors colors 
    { 
     get; 
     private set; 
    } 
    public fueltype fueltype 
    { 
     get; 
     private set; 
    } 

不是你的代碼的完全改變,但我想你會明白我的意思。如果你只是最終將它們轉換爲字符串,那麼聲明枚舉沒有意義。保持枚舉的方式。將它們傳遞給構造函數,並將它們保存爲您聲明的枚舉類型。