2008-09-09 32 views
5

Câu hỏi này là loại một add-on này questionC# chuyển đổi: Trường hợp không thuộc thông qua đối với trường hợp khác giới hạn

Trong C#, một trường hợp chuyển đổi không thể lọt qua đối với trường hợp khác, điều này gây ra một lỗi biên dịch. Trong trường hợp này tôi chỉ cần thêm một số vào tổng số tháng cho tháng đã chọn và mỗi tháng tiếp theo sau đó. (ví dụ đơn giản, không có nghĩa là thực)

switch (month) 
{ 
    case 0: 
     add something to month totals 
    case 1: 
     add something to month totals 
    case 2: 
     add something to month totals 
    default: 
     break; 
} 

Có sự thay thế hợp lý nào trong C# mà không phải viết ra một tấn câu lệnh if?

if (month <= 0) 
    add something to month 
if (month <= 1) 
    add something to month 
if (month <= 2) 
    add something to month 
.... etc 

Trả lời

11

Thông thường, khi bạn thấy tiếng ồn từ một câu lệnh chuyển đổi lớn hoặc nhiều câu lệnh có thể rơi vào nhiều hơn một khối, bạn đang cố gắng chặn thiết kế xấu.

Thay vào đó, điều gì sẽ xảy ra nếu bạn triển khai mẫu Đặc điểm để xem có gì đó phù hợp không và sau đó hành động trên đó?

foreach(MonthSpecification spec in this.MonthSpecifications) 
{ 
    if(spec.IsSatisfiedBy(month)) 
     spec.Perform(month); 
} 

thì bạn chỉ có thể thêm các thông số kỹ thuật khác nhau phù hợp với những gì bạn đang cố gắng làm.

Thật khó để nói tên miền của bạn là gì, vì vậy ví dụ của tôi có thể hơi ít giả tạo.

1

Hiện đã là một câu hỏi giải quyết chủ đề này:

C# switch statement limitations - why?

EDIT:

Mục đích chính của tôi trong chỉ ra rằng, gentlebeasts, đó là hai câu hỏi của tên gần như giống hệt nhau thêm nhầm lẫn vào nhóm câu hỏi.

+0

Vâng ... Tôi thừa nhận điều này trong câu hỏi .... –

+1

Tôi không thấy mối quan hệ (ngoài tiêu đề). Câu hỏi 44905 là về nguồn gốc của những hạn chế nhất định. Câu hỏi này là về cách vượt qua một giới hạn cụ thể (thậm chí không được đề cập trong câu hỏi khác). – mweerden

+2

Nếu bạn muốn chỉ ra rằng có vấn đề với tiêu đề, thì có lẽ bạn không nên thêm thẻ 'trùng lặp' nhưng thay đổi tiêu đề hoặc đề cập rõ ràng rằng bạn cho rằng có sự cố. – mweerden

1

Bạn có thêm hằng số không? Nếu vậy, có lẽ một cái gì đó như thế này sẽ làm việc (C cú pháp):

const int addToTotals[] = {123, 456, ..., 789}; 

for(i=month;i<12;i++) 
    totals += addToTotals[i]; 

Bạn có thể làm một điều tương tự với con trỏ biến hoặc chức năng nếu bạn cần báo cáo phức tạp hơn thêm liên tục để tổng số của mỗi tháng tiếp theo.

-Adam

7

Trong C tuyên bố # switch bạn có thể rơi qua trường hợp chỉ nếu không có lệnh nào cho trường hợp bạn muốn rơi qua

switch(myVar) 
{ 
    case 1: 
    case 2: // Case 1 or 2 get here 
     break; 
} 

Tuy nhiên nếu bạn muốn rơi qua với một tuyên bố bạn phải sử dụng GOTO sợ hãi

switch(myVar) 
    { 
     case 1: // Case 1 statement 
       goto case 2; 
     case 2: // Case 1 or 2 get here 
      break; 
    } 
+2

Tại sao GOTO lại sợ hãi? Ngoài ra, việc sử dụng "goto case" không phải là "tuyên bố goto". –

+2

Tôi nghĩ rằng việc sử dụng từ 'đáng sợ' là hợp lý. Tôi có thể dễ dàng tưởng tượng các lập trình viên bỏ lỡ bằng cách sử dụng 'goto case' trong một câu lệnh switch để làm cho nó nhảy từ case này sang case khác và quay trở lại case gốc. Goto dẫn đến spaghetti, spaghetti dẫn đến ghét, ghét dẫn đến đau khổ. Goto là con đường dẫn đến mặt tối. – Ben

0

Viết các trường hợp chuyển đổi theo thứ tự ngược

case 2: 

case 1: 

case 0: 

break; 


default: 

Hy vọng điều đó sẽ hữu ích!

+1

C# vẫn yêu cầu một câu lệnh điều khiển luồng (break/continue/return/goto/goto case/throw) giữa các trường hợp nếu có bất kỳ mã nào khác. –

Các vấn đề liên quan