2009-05-05 35 views
58

Có một số IIf tương đương trong C# không? Hoặc lối tắt tương tự?iif tương đương trong C#

+3

Tôi nghĩ bạn có nghĩa là "cắt ngắn", thay vì "ngắn mạch" (có ý nghĩa cụ thể liên quan đến các toán tử logic) - tôi có đúng không? – Blorgbeard

Trả lời

95

C# có toán tử bậc ba, giống như các ngôn ngữ kiểu C khác. Tuy nhiên, điều này không hoàn toàn tương đương với iif. Có hai điểm khác biệt quan trọng.

Để giải thích là người đầu tiên, điều này iif() cuộc gọi sẽ gây ra một ngoại lệ DivideByZero mặc dù biểu thức là đúng bởi vì iif chỉ là một chức năng và tất cả các đối số phải được thẩm định trước khi gọi:

iif(true, 1, 1/0) 

Nói cách khác, iif không ngắn gọn theo nghĩa truyền thống như câu hỏi của bạn. Mặt khác, biểu thức ternary này và như vậy là hoàn toàn tốt đẹp:

(true)?1:1/0; 

Sự khác biệt khác là iif không an toàn. Nó chấp nhận và trả về các đối số của loại object. Toán tử ternary sử dụng suy luận kiểu để biết kiểu nó đang xử lý. Lưu ý rằng bạn có thể sửa lỗi này rất dễ dàng với việc triển khai chung, nhưng trong hộp đó là cách thực hiện.

Nếu bạn thực sự muốn iif() trong C#, bạn có thể có nó:

object iif(bool expression, object truePart, object falsePart) 
{return expression?truePart:falsePart; } 

hoặc một/kiểu an thực hiện chung:

T iif<T>(bool expression, T truePart, T falsePart) 
{ return expression?truePart:falsePart;} 

Mặt khác, nếu bạn muốn toán tử ternary trong VB, Visual Studio 2008 và sau đó cung cấp một toán tử Ifmới hoạt động giống như ternary của C#. Nó sử dụng suy luận kiểu để biết nó quay trở lại, và nó là một toán tử chứ không phải là một hàm vì vậy mặc dù nó có ngữ nghĩa chức năng không có vấn đề gì từ các biểu thức đánh giá trước.

+2

VB9 không hỗ trợ toán tử ternary thực. Nếu (SomeBool, MessageBox.Show ("True"), MessageBox.Show ("False")) Như đã thấy ở đây: http://community.bartdesmet.net/blogs/bart/archive/2007/08/ 31/visual-basic-9-0-the-if-ternary-operator.aspx – snarf

+1

Tôi đề cập đến nó trong đoạn cuối, nhưng câu hỏi cụ thể về IIf(). –

11

các nhà điều hành ternary

bool a = true; 

string b = a ? "if_true" : "if_false"; 
+0

Tôi muốn thêm một bình luận ở đó là chuỗi b = (a? "Asdf": "dsrs"); tức là có thể hiểu rõ hơn cách thức hoạt động của nó, và để thấy rằng nó không phải là một cái gì đó thực sự kỳ lạ và vô nghĩa như (string b = a)? "sdf": "sdsdf"). – barlop

1

Đó là các nhà điều hành ternary ?

string newString = i == 1 ? "i is one" : "i is not one"; 
47

VB.NET:

If(someBool, "true", "false") 

C#

someBool ? "true" : "false"; 
+1

Trong khi điều này đúng với các biểu thức đơn giản, hai biểu mẫu không chính xác tương đương nếu có các tác dụng phụ trong các biểu thức thay thế. Iif (t, foo(), bar()) sẽ gọi cả foo() và bar(), trong khi t? foo(): bar() sẽ chỉ gọi foo() hoặc bar() nhưng không phải cả hai. Xem câu trả lời của Joel Coehoorn cho câu hỏi này để biết thêm thông tin. –

+1

Đã cập nhật câu trả lời để sử dụng chức năng "If" của VB.NET thay vì "IIf" sao cho hai khối mã tương đương nhau. –

7

Cũng hữu ích là các nhà điều hành liên hiệp ??:

VB:

Return Iif(s IsNot Nothing, s, "My Default Value") 

C#: "?"

return s ?? "My Default Value"; 
0

Nó bị giới hạn ở chỗ bạn không thể đặt câu trong đó. Bạn chỉ có thể đặt giá trị (hoặc những thứ mà trả lại/đánh giá các giá trị), để trở về

này hoạt động ('a' là một int tĩnh trong lớp Blah)

Blah.a=Blah.a<5?1:8; 

(dấu ngoặc tròn là impicitly giữa bằng và dấu hỏi).

Điều này không hiệu quả.

Blah.a = Blah.a < 4 ? Console.WriteLine("asdf") : Console.WriteLine("34er"); 
or 
Blah.a = Blah.a < 4 ? MessageBox.Show("asdf") : MessageBox.Show("34er"); 

Vì vậy, bạn chỉ có thể sử dụng toán tử C# ternary cho giá trị trả lại. Vì vậy, nó không giống như một hình thức rút ngắn của một nếu. Javascript và có lẽ một số ngôn ngữ khác cho phép bạn đặt các câu lệnh trong đó.

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