Có sự khác biệt đáng kể nào giữa việc sử dụng if / other và switch-case trong C # không?


219

Lợi ích / nhược điểm của việc sử dụng switchcâu lệnh so với if/elsetrong C # là gì. Tôi không thể tưởng tượng được có sự khác biệt lớn như vậy, ngoài khả năng là mã của bạn.

Có bất kỳ lý do tại sao IL kết quả hoặc hiệu suất thời gian chạy liên quan sẽ hoàn toàn khác nhau?

Liên quan: Cái gì nhanh hơn, bật chuỗi hoặc otherif trên loại?



3
Câu hỏi này chỉ thú vị trên lý thuyết cho phần lớn các nhà phát triển, trừ khi bạn thường thấy mình lặp đi lặp lại MỘT LẦN. (Sau đó sử dụng câu lệnh chuyển đổi và đi từ 48 đến 43 giây ...) Hoặc theo lời của Donald Knuth: "Chúng ta nên quên đi những hiệu quả nhỏ, nói về 97% thời gian: tối ưu hóa sớm là gốc rễ của mọi tội lỗi" vi.wikipedia.org/wiki/Program_optimization#When_to_optizes
Sire

Tôi thường sử dụng if / other thay vì switch vì phạm vi chuyển đổi được chia sẻ rất nhiều.
Josh

Câu trả lời:


341

Câu lệnh SWITCH chỉ tạo ra lắp ráp giống như IF trong chế độ gỡ lỗi hoặc tương thích. Trong bản phát hành, nó sẽ được biên dịch thành bảng nhảy (thông qua câu lệnh 'switch' của MSIL) - đó là O (1).

C # (không giống như nhiều ngôn ngữ khác) cũng cho phép bật các hằng chuỗi - và điều này hoạt động hơi khác một chút. Rõ ràng là không thực tế để xây dựng các bảng nhảy cho các chuỗi có độ dài tùy ý, do đó, phần lớn công tắc như vậy sẽ được biên dịch thành chồng IF.

Nhưng nếu số lượng điều kiện đủ lớn để che lấp các chi phí, trình biên dịch C # sẽ tạo một đối tượng HashTable, điền vào nó với các hằng chuỗi và thực hiện tra cứu trên bảng đó theo sau bước nhảy. Tra cứu Hashtable không hoàn toàn O (1) và có chi phí không đổi đáng chú ý, nhưng nếu số lượng nhãn trường hợp lớn, nó sẽ nhanh hơn đáng kể so với so với mỗi hằng số chuỗi trong IFs.

Tóm lại, nếu số lượng điều kiện nhiều hơn 5 hoặc hơn, hãy ưu tiên SWITCH hơn IF, nếu không thì sử dụng bất cứ điều gì có vẻ tốt hơn.


1
Bạn có chắc chắn trình biên dịch C # sẽ tạo ra một bảng băm không? Điểm tôi đưa ra về bảng băm trong cuộc thảo luận nhận xét của chúng tôi ở trên là về trình biên dịch gốc, không phải trình biên dịch C #. Trình biên dịch C # sử dụng ngưỡng nào để tạo bảng băm?
Scott Wisniewski

8
Tôi nghĩ khoảng mười. 20 để ở bên an toàn. Và btw, sự tức giận của tôi không phải là bạn, mà là những người nâng cao và chấp nhận.
ima

48
Một chút thử nghiệm cho thấy số lượng <= 6: "nếu"; đếm> = 7: từ điển. Đó là với trình biên dịch MS .NET 3.5 C # - tất nhiên nó có thể thay đổi giữa các phiên bản và nhà cung cấp.
Jon Skeet

37
Này, tôi nợ bạn một lời xin lỗi. Xin lỗi vì đã là một cái đầu xương.
Scott Wisniewski

Theo dõi, đối với các ứng dụng thực tế, có sự khác biệt nào trong thế giới thực hầu hết thời gian không? Tôi thấy các câu lệnh chuyển đổi trong C # là số lẻ, cú pháp của chúng không giống bất kỳ thứ gì khác và tôi thấy rằng chúng làm cho mã của tôi ít đọc hơn, có đáng để sử dụng các câu lệnh chuyển đổi không, hay tôi chỉ nên lập trình với các if khác và chỉ đến trở lại và thay thế chúng nếu tôi gặp phải tắc nghẽn hiệu suất?
Jason Masters

54

Nói chung (xem xét tất cả các ngôn ngữ và tất cả các trình biên dịch), một câu lệnh chuyển đổi CÓ THỂ SOMETIMES hiệu quả hơn một câu lệnh if / khác, bởi vì trình biên dịch dễ dàng tạo các bảng nhảy từ các câu lệnh chuyển đổi. Có thể làm điều tương tự cho các câu lệnh if / other, với các ràng buộc thích hợp, nhưng điều đó khó khăn hơn nhiều.

Trong trường hợp của C #, điều này cũng đúng, nhưng vì những lý do khác.

Với số lượng chuỗi lớn, có một lợi thế hiệu suất đáng kể để sử dụng câu lệnh chuyển đổi, bởi vì trình biên dịch sẽ sử dụng bảng băm để thực hiện bước nhảy.

Với một số lượng nhỏ chuỗi, hiệu suất giữa hai là như nhau.

Điều này là do trong trường hợp đó, trình biên dịch C # không tạo bảng nhảy. Thay vào đó, nó tạo ra MSIL tương đương với các khối IF / ELSE.

Có một lệnh "lệnh chuyển đổi" MSIL mà khi được kích hoạt sẽ sử dụng bảng nhảy để thực hiện câu lệnh chuyển đổi. Tuy nhiên, nó chỉ hoạt động với các kiểu số nguyên (câu hỏi này hỏi về chuỗi).

Đối với số lượng nhỏ chuỗi, trình biên dịch tạo các khối IF / ELSE hiệu quả hơn thì đó là sử dụng bảng băm.

Khi ban đầu tôi nhận thấy điều này, tôi đã đưa ra giả định rằng vì các khối IF / ELSE được sử dụng với một số lượng nhỏ chuỗi, trình biên dịch đã thực hiện chuyển đổi tương tự cho số lượng lớn các chuỗi.

Đây là SAI. "IMA" thật tốt bụng khi chỉ ra điều này cho tôi (ờ ... anh ấy không tử tế về điều đó, nhưng anh ấy đã đúng, và tôi đã sai, đó là phần quan trọng)

Tôi cũng đã đưa ra một giả định xương đầu về việc thiếu hướng dẫn "chuyển đổi" trong MSIL (tôi đoán, nếu có một công tắc nguyên thủy, tại sao họ không sử dụng nó với bảng băm, do đó không phải là một công tắc nguyên thủy. ...). Điều này vừa sai, vừa cực kỳ ngu ngốc về phía tôi. Một lần nữa, 'IMA' đã chỉ ra điều này cho tôi.

Tôi đã thực hiện các cập nhật ở đây vì đó là bài được đánh giá cao nhất và câu trả lời được chấp nhận.

Tuy nhiên, tôi đã biến nó thành Wiki cộng đồng vì tôi cho rằng tôi không xứng đáng với REP vì đã sai. Nếu bạn có cơ hội, vui lòng bình chọn bài đăng của tôi.


3
Có một công tắc nguyên thủy trong MSIL và các câu lệnh c # sẽ biên dịch thành tra cứu giống như C nói chung. Trong một số trường hợp nhất định (nền tảng đích, công tắc cl, v.v.) có thể được mở rộng thành IF trong quá trình biên dịch, nhưng đó chỉ là một biện pháp tương thích dự phòng.
ima

6
Tất cả những gì tôi có thể làm là xin lỗi vì đã phạm sai lầm ngu ngốc. Tin tôi đi, tôi cảm thấy ngớ ngẩn vì điều đó. Nghiêm túc mà nói, tôi nghĩ đó vẫn là câu trả lời tốt nhất. Có thể, trong các trình biên dịch riêng, sử dụng bảng băm để thực hiện bước nhảy, vì vậy đây không phải là một điều sai lầm khủng khiếp. Tôi đã phạm một sai lầm.
Scott Wisniewski

9
Ima, nếu có lỗi, chỉ ra chúng. Âm thanh như Scott sẽ được hạnh phúc để sửa bài. Nếu không, những người khác đã đạt được khả năng sửa một câu trả lời sẽ làm như vậy. Đó là cách duy nhất một trang web như thế này sẽ hoạt động, và có vẻ như, nói chung, nó đang hoạt động. Hoặc lấy bóng của bạn và về nhà :)
jwalkerjr

2
@Scott: Tôi khuyến khích bạn chỉnh sửa đoạn thứ hai và thứ ba để nói rõ ràng "cho chuỗi". Mọi người cũng có thể không đọc bản cập nhật ở phía dưới.
Jon Skeet

4
@ima Nếu bạn nghĩ rằng một câu trả lời là khách quan thì hãy chỉnh sửa nó thành chính xác. Đó là lý do tại sao mọi người có thể chỉnh sửa câu trả lời.
Miles Rout

18

Ba lý do để thích switch:

  • Trình biên dịch nhắm mục tiêu mã gốc thường có thể biên dịch một câu lệnh chuyển đổi thành một nhánh có điều kiện cộng với một bước nhảy gián tiếp trong khi một chuỗi ifs yêu cầu một chuỗi các nhánh có điều kiện . Tùy thuộc vào mật độ của các trường hợp, rất nhiều bài báo đã học được viết về cách biên dịch các báo cáo trường hợp một cách hiệu quả; một số được liên kết từ trang biên dịch lcc . (Lcc có một trong những trình biên dịch cải tiến hơn cho các bộ chuyển mạch.)

  • Câu lệnh chuyển đổi là một lựa chọn trong số các lựa chọn thay thế loại trừ lẫn nhau và cú pháp chuyển đổi làm cho điều khiển này trở nên trong suốt hơn đối với người lập trình sau đó là một tổ hợp các câu lệnh if-then-other.

  • Trong một số ngôn ngữ, bao gồm cả ML và Haskell, trình biên dịch sẽ kiểm tra xem bạn có bỏ sót trường hợp nào không . Tôi xem tính năng này là một trong những lợi thế chính của ML và Haskell. Tôi không biết nếu C # có thể làm điều này.

Một giai thoại: trong một bài giảng mà anh ấy đã nhận được khi nhận giải thưởng về thành tựu trọn đời, tôi đã nghe Tony Hoare nói rằng trong tất cả những điều anh ấy đã làm trong sự nghiệp của mình, có ba điều anh ấy tự hào nhất:

  • Phát minh Quicksort
  • Phát minh ra câu lệnh chuyển đổi (mà Tony gọi là casecâu lệnh)
  • Bắt đầu và kết thúc sự nghiệp của mình trong ngành công nghiệp

Tôi không thể tưởng tượng được sống mà không cóswitch .


16

Trình biên dịch sẽ tối ưu hóa khá nhiều thứ vào cùng một mã với những khác biệt nhỏ (Knuth, có ai không?).

Sự khác biệt là một câu lệnh switch sạch hơn mười lăm nếu các câu lệnh khác được xâu chuỗi lại với nhau.

Bạn bè không để bạn bè xếp chồng các câu lệnh if-other.


13
"Bạn bè không để bạn bè xếp chồng các câu lệnh if-other." Bạn nên tạo ra một sitcker bumber :)
Matthew M. Osborn

14

Trên thực tế, một tuyên bố chuyển đổi là hiệu quả hơn. Trình biên dịch sẽ tối ưu hóa nó thành một bảng tra cứu trong đó với câu lệnh if / other thì không thể. Mặt trái là câu lệnh chuyển đổi không thể được sử dụng với các giá trị biến.
Bạn không thể làm:

switch(variable)
{
   case someVariable
   break;
   default:
   break;
}

nó phải là

switch(variable)
{
  case CONSTANT_VALUE;
  break;
  default:
  break;
}

1
bạn có loại số nào không? Tôi tò mò về việc trình biên dịch có thể tối ưu hóa câu lệnh swtich tốt như thế nào qua If / Else
Matthew M. Osborn

có Tôi tin rằng một câu lệnh chuyển đổi luôn tối ưu hóa thành O (1) trong đó một câu lệnh if khác sẽ là O (n) trong đó n là vị trí của giá trị đúng trong câu lệnh if / other if.
kemiller2002

Trong trường hợp C # điều này không đúng, hãy xem bài viết của tôi dưới đây để biết thêm thông tin.
Scott Wisniewski

Tôi không hoàn toàn chắc chắn về điều đó, nhưng tôi không thể tìm thấy thông tin trong cuốn sách mà tôi thề là tôi đã tìm thấy nó. Bạn có chắc chắn rằng bạn không nhìn vào mã MSIL mà không tối ưu hóa. Nó sẽ không tạo bảng nhảy trừ khi bạn biên dịch với tối ưu hóa.
kemiller2002

Tôi đã biên dịch trong cả chế độ gỡ lỗi và bán lẻ, và trong cả hai trường hợp, nó tạo ra các khối if / khác. Bạn có chắc cuốn sách bạn đang xem đang nói về C # không? Cuốn sách có lẽ là một cuốn sách biên dịch hoặc một cuốn sách về C hoặc C ++
Scott Wisniewski

14

Tôi không thấy ai khác nêu quan điểm (rõ ràng?) Rằng lợi thế hiệu quả được cho là của tuyên bố chuyển đổi phụ thuộc vào các trường hợp khác nhau có khả năng tương đương nhau. Trong trường hợp một (hoặc một vài) giá trị có nhiều khả năng, thang if-then-other có thể nhanh hơn nhiều, bằng cách đảm bảo các trường hợp phổ biến nhất được kiểm tra trước:

Ví dụ:

if (x==0) then {
  // do one thing
} else if (x==1) {
  // do the other thing
} else if (x==2) {
  // do the third thing
}

đấu với

switch(x) {
  case 0: 
         // do one thing
         break;
  case 1: 
         // do the other thing
         break;
  case 2: 
         // do the third thing
         break;
}

Nếu x bằng 0% thời gian, mã "if-other" có thể nhanh gấp đôi so với mã dựa trên chuyển đổi. Ngay cả khi trình biên dịch biến "công tắc" thành một loại goto điều khiển bảng thông minh, nó vẫn sẽ không nhanh như việc kiểm tra số không.


3
Không tối ưu hóa sớm! Nói chung, nếu bạn có nhiều hơn chỉ một vài trường hợp và chúng không switchtương thích, thì switchcâu lệnh sẽ tốt hơn (dễ đọc hơn, đôi khi nhanh hơn). Nếu bạn biết rằng một trong những trường hợp có nhiều khả năng, bạn có thể kéo đó ra để tạo thành một if- else- switchxây dựng và nếu đó là cách đo nhanh hơn , bạn rời khỏi rằng trong (Lặp lại, nếu cần thiết.) IMO mà vẫn hợp lý có thể đọc được.. Nếu sự switchsuy biến và trở nên quá nhỏ, một regex-thay thế sẽ thực hiện hầu hết các công việc biến nó thành một else if-chain.
không ai

6
Câu hỏi ban đầu (ba năm trước!) Chỉ hỏi về ưu điểm & nhược điểm giữa if / other và switch. Đây là một ví dụ. Cá nhân tôi đã thấy loại tối ưu hóa này tạo ra sự khác biệt đáng kể trong thời gian chạy của một thói quen.
Mark Bessey

7

thường thì nó sẽ trông tốt hơn - tức là sẽ dễ hiểu hơn những gì đang diễn ra. Xem xét lợi ích hiệu suất sẽ cực kỳ tối thiểu, quan điểm của mã là sự khác biệt quan trọng nhất.

Vì vậy, nếu if / other trông tốt hơn, hãy sử dụng nó, nếu không thì sử dụng câu lệnh switch.


4

Chủ đề phụ, nhưng tôi thường lo lắng về (và thường thấy hơn) if/ elseswitchcâu lệnh trở nên quá lớn với quá nhiều trường hợp. Những điều này thường làm tổn thương khả năng bảo trì.

Thủ phạm phổ biến bao gồm:

  1. Làm quá nhiều bên trong nhiều câu lệnh if
  2. Nhiều báo cáo trường hợp hơn con người có thể phân tích
  3. Quá nhiều điều kiện trong đánh giá nếu biết những gì đang được tìm kiếm

Sửa chữa:

  1. Trích xuất để tái cấu trúc Phương thức.
  2. Sử dụng Từ điển với các con trỏ phương thức thay vì trường hợp hoặc sử dụng IoC để thêm cấu hình. Phương pháp nhà máy cũng có thể hữu ích.
  3. Trích xuất các điều kiện theo phương pháp riêng của họ

4

Theo liên kết này, IF so với Chuyển đổi so sánh kiểm tra lặp lại bằng cách sử dụng chuyển đổi và câu lệnh if, giống như với 1.000.000.000 lần lặp, Thời gian thực hiện bởi Switch Statement = 43.0s & by If Statement = 48.0s

Nghĩa đen là 20833333 lần lặp mỗi giây, Vì vậy, chúng ta có nên thực sự cần tập trung hơn không,

PS: Chỉ cần biết sự khác biệt hiệu suất cho danh sách nhỏ các điều kiện.


Đó là móng tay cho tôi.
Greg Gum

3

Nếu bạn chỉ đang sử dụng câu lệnh if hoặc khác thì giải pháp cơ sở đang sử dụng phần tổng hợp? nhà điều hành

(value == value1) ? (type1)do this : (type1)or do this;

Bạn có thể thực hiện hoặc thường xuyên trong một chuyển đổi

switch(typeCode)
{
   case TypeCode:Int32:
   case TypeCode.Int64:
     //dosomething here
     break;
   default: return;
}

2

Điều này không thực sự trả lời câu hỏi của bạn, nhưng được cho là sẽ có một chút khác biệt giữa các phiên bản được biên dịch, tôi khuyên bạn nên viết mã theo cách mô tả đúng nhất ý định của bạn. Không chỉ có cơ hội tốt hơn cho trình biên dịch làm những gì bạn mong đợi, mà nó sẽ giúp người khác dễ dàng duy trì mã của bạn hơn.

Nếu ý định của bạn là phân nhánh chương trình của bạn dựa trên giá trị của một biến / thuộc tính, thì câu lệnh switch thể hiện tốt nhất ý định đó.

Nếu ý định của bạn là phân nhánh chương trình của bạn dựa trên các biến / thuộc tính / điều kiện khác nhau, thì một if / other nếu chuỗi thể hiện tốt nhất ý định đó.

Tôi sẽ cấp cho cody đó là đúng về việc mọi người quên lệnh ngắt, nhưng hầu như tôi thường thấy mọi người làm phức tạp nếu các khối mà họ nhận được {} sai, vì vậy các dòng trong câu lệnh có điều kiện thì không. Đó là một trong những lý do tôi luôn đưa {} vào các câu lệnh if của mình ngay cả khi có một dòng trong đó. Không chỉ dễ đọc hơn, mà nếu tôi cần thêm một dòng khác trong điều kiện, tôi không thể quên thêm nó.


2

Câu hỏi quan tâm. Điều này đã xuất hiện vài tuần trước tại nơi làm việc và chúng tôi đã tìm thấy câu trả lời bằng cách viết một đoạn ví dụ và xem nó trong .NET Reflector (Reflector thật tuyệt vời !! tôi thích nó).

Đây là những gì chúng tôi đã phát hiện ra: Một câu lệnh chuyển đổi hợp lệ cho bất kỳ thứ gì ngoài chuỗi được biên dịch sang IL dưới dạng câu lệnh chuyển đổi. Tuy nhiên NẾU nó là một chuỗi, nó được viết lại dưới dạng if / other if / other trong IL. Vì vậy, trong trường hợp của chúng tôi, chúng tôi muốn biết làm thế nào các câu lệnh chuyển đổi so sánh các chuỗi, ví dụ như phân biệt chữ hoa chữ thường, v.v. và phản xạ nhanh chóng cho chúng tôi một câu trả lời. Điều này rất hữu ích để biết.

Nếu bạn muốn thực hiện so sánh phân biệt chữ hoa chữ thường trên các chuỗi thì bạn có thể sử dụng câu lệnh chuyển đổi vì nó nhanh hơn so với thực hiện String.Compare trong if / other. (Chỉnh sửa: Đọc Cái gì nhanh hơn, bật chuỗi hoặc loại khác trên loại? Đối với một số thử nghiệm hiệu năng thực tế) Tuy nhiên nếu bạn muốn làm một trường hợp không nhạy cảm thì tốt hơn là sử dụng if / other vì mã kết quả không đẹp.

switch (myString.ToLower())
{
  // not a good solution
}

Nguyên tắc tốt nhất là sử dụng các câu lệnh chuyển đổi nếu nó có ý nghĩa (nghiêm túc), ví dụ:

  • nó cải thiện khả năng đọc mã của bạn
  • bạn đang so sánh một phạm vi các giá trị (float, int) hoặc enum

Nếu bạn cần thao tác giá trị để đưa vào câu lệnh chuyển đổi (tạo một biến tạm thời để chuyển đổi) thì có lẽ bạn nên sử dụng câu lệnh điều khiển if / other.

Một bản cập nhật:

Thực sự tốt hơn để chuyển đổi chuỗi thành chữ hoa (ví dụ ToUpper()) vì rõ ràng có những tối ưu hóa hơn nữa mà trình biên dịch đúng lúc có thể làm như khi so sánh với ToLower(). Đây là một tối ưu hóa vi mô, tuy nhiên trong một vòng lặp chặt chẽ, nó có thể hữu ích.


Một lưu ý nhỏ:

Để cải thiện khả năng đọc của câu lệnh chuyển đổi, hãy thử như sau:

  • đặt nhánh có khả năng đầu tiên tức là truy cập nhiều nhất
  • nếu tất cả chúng có khả năng xảy ra, hãy liệt kê chúng theo thứ tự bảng chữ cái để dễ tìm thấy chúng hơn.
  • không bao giờ sử dụng tất cả bắt mặc định cho điều kiện còn lại cuối cùng, đó là sự lười biếng và sẽ gây ra các vấn đề sau này trong cuộc sống của mã.
  • sử dụng bắt tất cả mặc định để xác nhận một điều kiện chưa biết mặc dù rất khó xảy ra. đó là những gì khẳng định là tốt cho.

Trong nhiều trường hợp, sử dụng ToLower () là giải pháp phù hợp, đặc biệt nếu có nhiều trường hợp và bảng băm được tạo.
Blaisorblade

"Nếu bạn cần thao tác giá trị để đưa vào câu lệnh chuyển đổi (tạo một biến tạm thời để chuyển đổi) thì có lẽ bạn nên sử dụng câu lệnh điều khiển if / other." - Lời khuyên tốt, cảm ơn.
Lén lút

2

Câu lệnh switch chắc chắn là nhanh hơn nếu khác nếu. Có speedtest đã được BlackWasp cung cấp trên đó

http://www.blackwasp.co.uk/SpeedTest IfElseSwitch.aspx

- Kiểm tra xem nó ra

Nhưng phụ thuộc rất nhiều vào các khả năng mà bạn đang cố gắng tính đến, nhưng tôi cố gắng sử dụng câu lệnh chuyển đổi bất cứ khi nào có thể.


1

Không chỉ C #, mà tất cả các ngôn ngữ dựa trên C, tôi nghĩ: bởi vì một công tắc được giới hạn ở các hằng số, nên có thể tạo mã rất hiệu quả bằng cách sử dụng "bảng nhảy". Trường hợp C thực sự là một FORTRAN cũ đã tính toán GOTO, nhưng trường hợp C # vẫn đang thử nghiệm với một hằng số.

Nó không phải là trường hợp mà trình tối ưu hóa sẽ có thể tạo cùng một mã. Hãy xem xét, ví dụ,

if(a == 3){ //...
} else if (a == 5 || a == 7){ //...
} else {//...
}

Bởi vì đó là các booleans hỗn hợp, mã được tạo phải tính toán một giá trị và shortcircuit. Bây giờ hãy xem xét tương đương

switch(a){
   case 3: // ...
    break;
   case 5:
   case 7: //...
    break;
   default: //...
}

Điều này có thể được biên dịch thành

BTABL: *
B3:   addr of 3 code
B5:
B7:   addr of 5,7 code
      load 0,1 ino reg X based on value
      jump indirect through BTABL+x

bởi vì bạn đang ngầm nói với trình biên dịch rằng nó không cần phải tính toán các phép thử OR và đẳng thức.


Không có lý do gì trình tối ưu hóa tốt không thể xử lý mã thứ 1, miễn là trình tối ưu hóa được triển khai. "Trình biên dịch không thể tối ưu hóa" chỉ phụ thuộc vào sự khác biệt về ngữ nghĩa mà chỉ con người mới có thể điều hòa (nghĩa là nếu f () được gọi, thì không biết rằng f () luôn trả về 0 hoặc 1).
Blaisorblade

0

Giáo sư cs của tôi đề nghị không cho bạn chuyển đổi các câu lệnh vì thường mọi người quên mất việc sử dụng hoặc sử dụng nó không đúng. Tôi không thể nhớ chính xác những gì anh ấy nói, nhưng có gì đó dọc theo dòng nhìn vào một số cơ sở mã tinh dịch cho thấy các ví dụ về tuyên bố chuyển đổi (nhiều năm trước) cũng có vô số lỗi trong đó.


Không thực sự là một vấn đề trong C #. Xem: stackoverflow.com/questions/174155/ trên ... và cũng đọc stackoverflow.com/questions/188461/ cho một cuộc thảo luận về lý do tại sao sống trong sợ hãi có thể không phải là chính sách tốt nhất ...
Shog9

0

Một cái gì đó mà tôi chỉ nhận thấy là bạn có thể kết hợp if / other và chuyển đổi các câu lệnh! Rất hữu ích khi cần kiểm tra điều kiện tiên quyết.

if (string.IsNullOrEmpty(line))
{
    //skip empty lines
}
else switch (line.Substring(0,1))
{
    case "1":
        Console.WriteLine(line);
        break;
    case "9":
        Console.WriteLine(line);
        break;
    default:
        break;
}

3
Tôi biết điều này đã cũ, nhưng tôi nghĩ về mặt kỹ thuật bạn không "kết hợp" bất cứ điều gì. Bất cứ khi nào bạn có một "cái khác" không có dấu ngoặc nhọn, câu lệnh tiếp theo sẽ được thực thi. Câu lệnh đó có thể là câu lệnh một dòng, thường được hiển thị thụt vào dòng tiếp theo hoặc câu lệnh tổng hợp như trường hợp if, switch, sử dụng, khóa, v.v. Nói cách khác, bạn có thể có "other if", " other switch "," other using ", v.v ... Đã nói rằng, tôi thích cách nó trông và gần như có chủ ý. (Tuyên bố miễn trừ trách nhiệm: Tôi đã không thử tất cả những điều này vì vậy tôi có thể sai!)
Nelson Rothermel

Nelson, bạn đúng 100%. Tôi đã tìm ra lý do tại sao điều này xảy ra sau khi tôi đã đăng câu trả lời này.
Ngay cả Miên

0

Tôi nghĩ rằng Switch nhanh hơn nhiều so với các điều kiện như xem nếu có một chương trình như:

Viết Chương trình để nhập bất kỳ số nào (trong khoảng 1 - 99) và kiểm tra xem nó có nằm trong khe nào a) 1 - 9 rồi khe một b) 11 - 19 rồi khe hai c) 21-29 rồi khe ba và cứ thế cho đến 89- 99

Sau đó, nếu bạn phải thực hiện nhiều điều kiện nhưng trường hợp chuyển đổi con trai bạn chỉ cần gõ

Chuyển đổi (không / 10)

và trong trường hợp 0 ​​= 1-9, trường hợp 1 = 11-19 và cứ thế

nó sẽ rất dễ dàng

Có nhiều ví dụ như vậy nữa!


0

một tuyên bố chuyển đổi cơ bản là một so sánh cho bình đẳng. sự kiện bàn phím có một lợi thế lớn so với câu lệnh chuyển đổi khi dễ viết và đọc mã thì một câu lệnh ififif khác, thiếu {ngoặc} cũng có thể gặp rắc rối.

char abc;
switch(abc)
{
case a: break;
case b: break;
case c: break;
case d: break;
}

Một câu lệnh ifif khác là tuyệt vời cho nhiều hơn một giải pháp nếu (theAmountOfApples lớn hơn 5 && theAmountOfApples ít hơn 10) hãy lưu táo của bạn nếu if (theAmountOfApples lớn hơn 10 || theAmountOfApples = 10) Tôi không viết c # hoặc c ++ nhưng tôi đã học nó trước khi tôi học java và chúng là những ngôn ngữ gần gũi.


0

Một nhược điểm có thể có của các câu lệnh chuyển đổi là thiếu nhiều điều kiện. Bạn có thể có nhiều điều kiện cho câu lệnh if (khác) nhưng không có nhiều câu lệnh với các điều kiện khác nhau trong một chuyển đổi.

Các câu lệnh chuyển đổi không phù hợp với các hoạt động logic ngoài phạm vi của các phương trình / biểu thức Boolean đơn giản. Đối với các phương trình / biểu thức Boolean, nó rất phù hợp nhưng không phù hợp với các hoạt động logic khác.

Bạn có nhiều tự do hơn với logic có sẵn trong các câu lệnh If nhưng khả năng đọc có thể bị ảnh hưởng nếu câu lệnh If trở nên khó sử dụng hoặc được xử lý kém.

Cả hai đều có chỗ tùy thuộc vào bối cảnh của những gì bạn phải đối mặt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.