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.