2012-12-04 7 views
5

Tôi đã phát triển cho windows mobile và android trong một thời gian. Và tôi bối rối về hai khái niệm này.Enum VS Static Class (Giá trị chuỗi thông thường và chuỗi giá trị)

Giả sử tôi muốn đưa ra quyết định dựa trên một số kích thước màn hình thiết bị của người dùng. Vì vậy, tôi sẽ mong đợi các giá trị được xác định trước. Tôi có thể sử dụng một tuyên bố chuyển đổi để xử lý logic của tôi. Nhưng tôi không chắc liệu tôi có nên sử dụng Enum của một lớp tĩnh cho mục đích này hay không. Cái nào là một cách tiếp cận tốt hơn. Tôi có thể làm logic của mình theo hai cách khác nhau. Cách nào đúng là cách tiếp cận? Tôi bối rối. Và tôi có thể sử dụng các giá trị String không? Bởi vì hiện tại tôi đang gắn bó với các lớp học, tôi cần phải cập nhật để sử dụng tất cả các enums. Vì vậy, Làm thế nào về việc thay đổi lớp của tôi để String Enum? Dù sao. Cảm ơn.

Sử dụng Enum

//My predefined values 
public enum ScreenSizeEnum 
{ 
    Small, Medium, Large, XLarge, 
} 
//Handling Logic 
private void SetScreenSize(ScreenSizeEnum Screen) 
{ 
    switch (Screen) 
    { 
     case ScreenSizeEnum.Large: 
      //Do Logic 
      break; 
     case ScreenSizeEnum.Small: 
      //Do Logic 
      break; 
    } 
} 

Sử dụng Lớp

//My predefined values 
public class ScreenSizeClass 
{ 
    public const int Small = 0; 
    public const int Medium = 1; 
    public const int Large = 2; 
    public const int XLarge = 3; 
} 
//Handling Logic 
private void SetScreenSize(int Screen) 
{ 
    switch (Screen) 
    { 
     case ScreenSizeClass.Large: 
      //Do Logic 
      break; 
     case ScreenSizeClass.Small: 
      //Do Logic 
      break; 
    } 
} 
+0

Trải nghiệm gỡ lỗi với enums tốt hơn nhiều (ít nhất là trong C#). Hãy thử gỡ lỗi một công tắc với hàng trăm trường hợp chuyển sang mã 'int'. –

+0

Có thẻ 'Java' trên câu hỏi này. Mã ví dụ bạn hiển thị cho 'enum' sẽ không hoạt động với Java. Enums trong Java không hoạt động giống như C# khi sử dụng 'switch'. – Squonk

+0

Vâng. Tôi biết điều đó. Tôi đang làm chính xác cùng một dòng chảy trong ứng dụng Android của tôi. Tôi nghĩ rằng nó có thể là quá dài nếu tôi đặt mã java cũng. Nhưng tôi hy vọng khái niệm này là như nhau. –

Trả lời

4

Từ Enumeration Types (C# Programming Guide):

Một kiểu enumeration (còn có tên là một điều tra hoặc một enum) cung cấp một cách hiệu quả để xác định tập hợp các hằng số tích phân có tên có thể là được gán cho một biến.

Sau đây là những lợi thế của việc sử dụng một enum thay vì một số loại:

  1. Bạn chỉ rõ ràng cho mã khách hàng mà giá trị có giá trị cho biến.

  2. Trong Visual Studio, IntelliSense liệt kê các giá trị được xác định.

Vì vậy, nếu bạn vượt qua enum, nó được đánh máy mạnh mẽ, vì vậy bạn tự động nhận được quyền kiểm soát những gì bạn có thể đi vào một phương pháp.

ScreenSizeEnum size = ScreenSizeEnum.Medium; 
SetScreenSize(size); 

Khi sử dụng const hoặc static trường bạn definetely cần phải kiểm tra xem giá trị thông qua int được lấy từ nhịp điệu kỳ vọng.

int somevalue = ...;//anything 
SetScreenSize(somevalue); //compiles 

private void SetScreenSize(int Screen) 
{ 
    switch (Screen) 
    { 
     case ScreenSizeClass.Large: 
      //Do Logic 
      break; 
     case ScreenSizeClass.Small: 
      //Do Logic 
      break; 
     default: 
      // something else, what to do?? 
      break; 
    } 
} 

Dựa trên nhận xét:

Nếu đó là cần thiết để kiểm tra, cho dù một số int được định nghĩa trong enum, người ta có thể làm điều gì đó như thế này:

int somevallue = 0; 
if(Enum.IsDefined(typeof(ScreenSizeEnum), somevallue)) 
{ 
    //it's ok 
} 

Hoặc một phương thức mở rộng:

public static T GetEnumValue<T>(this string value) where T : struct 
{ 
    Type t = typeof(T); 
    if (!t.IsEnum) 
     throw new Exception("T must be an enum"); 
    else 
    { 
     T result; 
     if (Enum.TryParse<T>(value, out result)) 
      return result; 
     else 
      return default(T); 
    } 
} 

mà có thể được sử dụng

int somevalue = 1; 
ScreenSizeEnum size = somevalue.GetEnumValue<ScreenSizeEnum>(); 

Đối với string (dựa trên câu hỏi đã chỉnh sửa OP của):

Từ enum (C# Reference):

Các loại chấp thuận cho một enum là byte, sbyte, ngắn, ushort, int, uint, dài hoặc ulong.

Vì vậy, bạn không thể có enum chuỗi. Nhưng bạn có thể sử dụng tên từ enums, như phương pháp ToString trả về tên, không phải là giá trị của enum.

ScreenSizeEnum.Small.ToString(); //Small 

Vì vậy, bạn có thể có một phương pháp mở rộng trên dây:

public static T GetEnumValue<T>(this string value) where T : struct 
{ 
    Type t = typeof(T); 
    if (!t.IsEnum) 
     throw new Exception("T must be an enum"); 
    else 
    { 
     if (Enum.IsDefined(t, value)) 
      return (T)Enum.Parse(t, value); 
     else 
      return default(T); 
    } 
} 

Vì vậy mà

int i = (int)ScreenSizeEnum.Small; 
string str = ScreenSizeEnum.Small.ToString(); 
ScreenSizeEnum isize = i.GetEnumValue<ScreenSizeEnum>();//ScreenSizeEnum.Small 
ScreenSizeEnum strsize = str.GetEnumValue<ScreenSizeEnum>();//ScreenSizeEnum.Small 
+1

Bạn luôn có thể truyền một 'int' tùy ý thành một enum, do đó bạn vẫn nên kiểm tra enums về tính hợp lệ. –

+0

@mikez Đó là một câu hỏi khác và bên cạnh đó là một loạt các phương pháp tốt đẹp cho điều đó. – horgh

+0

Cảm ơn câu trả lời tuyệt vời này. +1 & Chấp nhận. :) –

8

Đây chính xác là những gì enums đang có cho. Không phải là bạn không thể sử dụng lớp tĩnh với các hằng số, nhưng enum là của xa sạch ...

+0

Đúng vậy. Người dùng của SetScreenSize() rõ ràng họ phải vượt qua các giá trị cụ thể và không phải là một người có thể là chiều rộng màn hình như 640. – PRouleau

+0

Ngoại trừ không cố gắng sử dụng 'enums' trong Java theo cách OP đã thể hiện trong câu hỏi của họ. – Squonk

1

enums về cơ bản được sử dụng khi bạn muốn có một biến hay tham số có giá trị từ một cố định thiết lập các hằng số có thể. Bạn có thể thay thế enums bằng lớp với một tập hợp các hằng số int cuối cùng tĩnh. Nhưng sử dụng enums là linh hoạt hơn & thẩm định có thể đọc được trong phần sau.