2009-11-25 32 views
11

Dường như tôi cần sử dụng dấu ngắt trong mỗi khối trường hợp trong câu lệnh chuyển đổi của tôi bằng C#.C# switch/break

Tôi có thể thấy lý do cho điều này bằng các ngôn ngữ khác, nơi bạn có thể chuyển sang câu lệnh trường hợp tiếp theo.

Có thể chặn các khối chữ thường xuống các khối chữ hoa chữ thường khác không?

Cảm ơn rất nhiều, thực sự được đánh giá cao!

Trả lời

29

Có, bạn có thể chuyển sang khối trường hợp tiếp theo theo hai cách. Bạn có thể sử dụng trường hợp có sản phẩm nào, mà không cần nghỉ ngơi, hoặc bạn có thể sử dụng goto để nhảy đến tiếp theo (hoặc bất kỳ) trường hợp:

switch (n) { 
    case 1: 
    case 2: 
    case 3: 
    Console.WriteLine("1, 2 or 3"); 
    goto case 4; 
    case 4: 
    Console.WriteLine(4); 
    break; 
} 
+1

Báo cáo trường hợp trống không hợp pháp và 'trường hợp 1' không phản đối điều này. Xem [Giải thích của Eric Lippert] (http://stackoverflow.com/questions/3047863/how-can-i-use-more-than-one-constant-for-a-switch-case-in-c/3049601#3049601), cũng như nhận xét của tôi đề cập đến lý do tại sao sự khác biệt này không phải là một ngôn ngữ. Nói với mọi người rằng các khối thùng trống là hợp pháp [khiến họ mắc lỗi] (http://stackoverflow.com/q/8071655/18192). – Brian

+3

@Brian: Bạn có thể gọi nó là cái gì khác nếu bạn thích, nhưng đoạn mã trên hoàn toàn hợp pháp. Tất nhiên, về mặt kỹ thuật, mã sẽ không được triển khai như một chuỗi các khối mã mà bạn gặp phải, nhưng đó không phải là trường hợp trong bất kỳ ngôn ngữ nào và có thể nói tương tự về hầu hết các cấu trúc điều khiển. Sai lầm mà bạn liên kết đến không liên quan đến các trường hợp trống ở tất cả (hoặc bất cứ điều gì bạn muốn gọi cho họ), vì nó không có sản phẩm nào. – Guffa

2

C# không hỗ trợ xây dựng ngầm xuyên qua, nhưng break (hoặc goto) tuy nhiên phải ở đó (msdn). Điều duy nhất bạn có thể làm là ngăn xếp trường hợp theo cách sau đây:

switch(something) { 
    case 1: 
    case 2: 
     //do something 
     break; 
    case 3: 
     //do something else 
} 

nhưng break đó (hoặc một tuyên bố nhảy như goto) chỉ cần có mặt ở đó.

+0

Điều này không hoàn toàn chính xác. Nó không phải là một "nhảy" tuyên bố (mà tôi giả sử bạn có nghĩa là phá vỡ, tiếp tục, goto, trở lại hoặc ném) đã được ở cuối, đó là một tuyên bố với một điểm kết thúc không thể truy cập phải được ở cuối. Tất cả các câu lệnh "jump" đều có thuộc tính đó, nhưng cũng có các câu lệnh khác với thuộc tính đó. Ví dụ, nó hoàn toàn hợp pháp, mặc dù hiếm, để kết thúc một phần chuyển đổi với "while (true) M();" –

+1

Tôi thấy rằng tài liệu MSDN không chính xác. Tôi sẽ nói chuyện với người quản lý tài liệu. –

5

Việc thi hành "nghỉ ngơi" ở đó để ngăn chặn lỗi. Nếu bạn cần phải buộc một mùa thu-thru sau đó sử dụng "goto case" (thay thế với giá trị thích hợp)

ví dụ sau đây cho thấy những gì bạn có thể làm:

switch(n) 
{ 
    case 1: 
    case 2: 
     //do something for 1+2 
     //... 
     goto case 3; 
    case 3: 
     //do something for 3, and also extra for 1+2 
     //... 
     break; 
    default: 
     //do something for all other values 
     //... 
     break; 
} 

Xem http://msdn.microsoft.com/en-us/library/06tc147t%28VS.80%29.aspx

+1

Nếu nó không hỗ trợ thông qua, sau đó không có lỗi để được ngăn chặn. Cho dù một break có hay không, nếu ngôn ngữ không hỗ trợ rơi qua, nó không hỗ trợ nó, dòng dưới cùng.Biên dịch thời gian thực thi của 'phá vỡ;' không ngăn cản bạn vô tình rơi qua, bởi vì như bạn đã nói, qua không thậm chí được hỗ trợ để một tai nạn không thể xảy ra ... – AaronLS

0

Trong tôi Mã C# (.NET 1.1, CF), cả hai đều được cho phép:

switch (_printerChoice) 
{ 
    case BeltPrintersEnum.ZebraQL220: 
     return new ZebraQL220Printer(); 
     break; 
    case BeltPrintersEnum.ONeal: 
     return new ONealPrinter(); 
     break; 
    default:    
     return new ZebraQL220Printer();   
         break; 
} 

switch (_printerChoice) 
{ 
    case BeltPrintersEnum.ZebraQL220: 
     return new ZebraQL220Printer(); 
    case BeltPrintersEnum.ONeal: 
     return new ONealPrinter(); 
    default:    
     return new ZebraQL220Printer();   
} 

... nhưng khi ngắt, chúng chuyển sang màu xám, được coi là tranh luận. Vì vậy, ít nhất trong trường hợp của tôi, họ được phép nhưng không bắt buộc.

+1

Một tuyên bố trả về (cũng như ném ngoại lệ) gây ra mã để rời khỏi phương thức hoàn chỉnh, đó là lý do tại sao một câu lệnh break sau đây là không cần thiết sau đó. Không có cấu trúc chuyển đổi để rời khỏi nữa. – Udontknow