2011-11-10 55 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; 
    } 

不是你的代码的完全改变,但我想你会明白我的意思。如果你只是最终将它们转换为字符串,那么声明枚举没有意义。保持枚举的方式。将它们传递给构造函数,并将它们保存为您声明的枚举类型。