2012-09-14 13 views
8

Giả sử tôi có một loạt các lĩnh vực tĩnh và tôi muốn sử dụng chúng trong chuyển đổi:Chuyển tuyên bố với các lĩnh vực tĩnh

public static string PID_1 = "12"; 
public static string PID_2 = "13"; 
public static string PID_3 = "14"; 

switch(pid) 
{ 
    case PID_1: 
     //Do something 1 
     break; 
    case PID_2: 
     //Do something 2 
     break; 
    case PID_3: 
     //Do something 3 
     break; 
    default: 
     //Do something default 
     break; 
} 

Kể từ C# không cho phép tuyên bố không const bên trong công tắc. Tôi muốn hiểu ý định của loại thiết kế này là gì. Làm thế nào tôi nên làm một cái gì đó như trên trong C#?

+2

các giá trị của PID_1 PID_2 vv sẽ thay đổi? –

+0

Mr.Mindor. Không, nhưng tôi cũng muốn chúng tĩnh. – Ashutosh

+1

@Ashutosh Tất cả các giá trị 'const' là hiệu quả' tĩnh'. Chúng không liên quan đến một thể hiện của lớp.Bạn không sử dụng 'static' vì nó thừa, không phải vì nó không thể. – Servy

Trả lời

16

Dường như các giá trị chuỗi đó chỉ đơn giản là không đổi.

public const string PID_1 = "12"; 
public const string PID_2 = "13"; 
public const string PID_3 = "14"; 

Nếu đó không phải là tùy chọn (chúng thực sự thay đổi khi chạy), bạn có thể cấu trúc lại giải pháp đó thành một chuỗi nếu/nếu có câu lệnh.

Vì sao các câu lệnh của trường hợp cần phải không đổi; bằng cách giữ chúng không đổi, nó cho phép tuyên bố được tối ưu hóa nhiều hơn nhiều. Nó thực sự hiệu quả hơn một loạt các câu lệnh if/else if (mặc dù không đáng kể vì vậy nếu bạn không có lot kiểm tra có điều kiện mất nhiều thời gian). Nó sẽ tạo ra tương đương với một bảng băm với các giá trị báo cáo trường hợp như các khóa. Cách tiếp cận đó không thể được sử dụng nếu các giá trị có thể thay đổi.

+0

Ok. vậy tại sao chúng ta không thể sử dụng các trường chỉ đọc? sử dụng const không phải là một lựa chọn. Có một static công cộng có ý nghĩa hơn cho các định danh liên tục .. Tôi không thể sử dụng chúng bất cứ nơi nào tôi muốn và tôi chỉ có một ví dụ của nó ... – Ashutosh

+2

@Ashutosh Bạn không thể sử dụng các trường chỉ đọc bởi vì giá trị không được biết cho đến khi thời gian chạy; câu lệnh 'switch' sẽ dẫn đến một bảng được tạo ra tại * thời gian biên dịch *, đó là lý do tại sao các câu lệnh case cần phải biên dịch hằng số thời gian. '' Có ​​một tĩnh công cộng có ý nghĩa hơn "' Nếu các giá trị thực sự không đổi, tôi không đồng ý. Sử dụng giá trị 'const' có ý nghĩa hơn nhiều nếu các giá trị thực sự không đổi. Lưu ý rằng tất cả các giá trị 'const' là hiệu quả' tĩnh'. Họ không bị ràng buộc với một thể hiện của đối tượng ở tất cả. – Servy

2

Đối số trường hợp phải không đổi trên thời gian biên dịch.

Cố gắng sử dụng const thay vì:

public const string PID_1 = "12"; 
public const string PID_2 = "13"; 
public const string PID_3 = "14"; 
+0

@Henk: Cảm ơn! Thật là một lỗi lầm ngớ ngẩn :) – abatishchev

3

... C# không cho phép tuyên bố không const bên trong công tắc ...

Nếu bạn không thể sử dụng:

public const string PID_1 = "12"; 
public const string PID_2 = "13"; 
public const string PID_3 = "14"; 

Bạn có thể sử dụng từ điển :)

.... 
public static string PID_1 = "12"; 
public static string PID_2 = "13"; 
public static string PID_3 = "14"; 



// Define other methods and classes here 

void Main() 
{ 
    var dict = new Dictionary<string, Action> 
    { 
    {PID_1,()=>Console.WriteLine("one")}, 
    {PID_2,()=>Console.WriteLine("two")}, 
    {PID_3,()=>Console.WriteLine("three")}, 
    }; 
    var pid = PID_1; 
    dict[pid](); 
} 
+0

Tôi chỉ đang viết nó lên. –

1

Tôi giả sử có lý do bạn không khai báo các biến đó là const. Điều đó nói rằng:

Tuyên bố switch chỉ là viết tắt cho một loạt các tuyên bố if/else if. Vì vậy, nếu bạn có thể đảm bảo rằng PID_1, PID_2, và PID_3 sẽ không bao giờ được bình đẳng, ở trên là tương đương với điều này:

if (pid == PID_1) { 
    // Do something 1 
} 
else if (pid == PID_2) { 
    // Do something 2 
} 
else if (pid == PID_3) { 
    // Do something 3 
} 
else { 
    // Do something default 
} 
+0

Việc chuyển đổi trên chuỗi cũng có thể được thực hiện dưới dạng từ điển (https://stackoverflow.com/a/3366497/616827). – Jeff

1

Cách kinh điển để tiếp cận này - nếu lĩnh vực tĩnh của bạn không thực sự hằng số - là sử dụng một số Dictionary<Something, Action>:

static Dictionary<string, Action> switchReplacement = 
    new Dictionary<string, Action>() { 
     { PID_1, action1 }, 
     { PID_2, action2 }, 
     { PID_3, action3 }}; 

// ... Where action1, action2, and action3 are static methods with no arguments 

// Later, instead of switch, you simply call 
switchReplacement[pid].Invoke();