Trong Visual Basic, có sự khác biệt về hiệu suất khi sử dụng IIf
hàm thay vì If
câu lệnh không?
Trong Visual Basic, có sự khác biệt về hiệu suất khi sử dụng IIf
hàm thay vì If
câu lệnh không?
Câu trả lời:
VB có câu sau If
mà câu hỏi đề cập đến, tôi nghĩ:
' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")
Đầu tiên về cơ bản là toán tử điều kiện bậc ba của C # và thứ hai là toán tử liên kết của nó (trả về result
trừ khi nó Nothing
, trong trường hợp đó trả về "Alternative"
). If
do đó đã thay thế IIf
và sau này là lỗi thời.
Giống như trong C #, If
ngắn mạch toán tử có điều kiện của VB , vì vậy bây giờ bạn có thể viết một cách an toàn như sau, điều này không thể thực hiện được bằng cách sử dụng IIf
hàm:
Dim len = If(text Is Nothing, 0, text.Length)
If
hiệu quả hơn IIf
hàm cho đến nay.
That's all you need to know, really
không âm thanh như một thái độ thuận lợi cho một trang web dành cho việc chia sẻ kiến thức;)
IIf()
chạy cả mã đúng và sai. Đối với những thứ đơn giản như gán số, đây không phải là vấn đề lớn. Nhưng đối với mã yêu cầu bất kỳ loại xử lý nào, bạn đang lãng phí các chu kỳ chạy điều kiện không phù hợp và có thể gây ra các tác dụng phụ.
Mã minh họa:
Module Module1
Sub Main()
Dim test As Boolean = False
Dim result As String = IIf(test, Foo(), Bar())
End Sub
Public Function Foo() As String
Console.WriteLine("Foo!")
Return "Foo"
End Function
Public Function Bar() As String
Console.WriteLine("Bar!")
Return "Bar"
End Function
End Module
Kết quả đầu ra:
Foo!
Bar!
Ngoài ra, một vấn đề lớn khác với IIf là nó sẽ thực sự gọi bất kỳ hàm nào có trong các đối số [1], vì vậy nếu bạn gặp trường hợp như sau:
string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)
Nó thực sự sẽ ném ra một ngoại lệ, đây không phải là cách mà hầu hết mọi người nghĩ rằng hàm hoạt động ngay lần đầu tiên họ nhìn thấy nó. Điều này cũng có thể dẫn đến một số lỗi rất khó sửa trong một ứng dụng.
[1] Hàm IIf - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx
Sử dụng tốt hơn If thay vì IIf để sử dụng cơ chế suy luận kiểu chính xác (Tùy chọn Infer On)
Trong ví dụ này, Từ khóa được nhận dạng là một chuỗi khi tôi sử dụng Nếu:
Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Nếu không, nó được công nhận là một Đối tượng:
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Theo anh chàng này , IIf có thể mất tới 6 lần miễn là If / Then. YMMV.
Trên hết, khả năng đọc có lẽ nên được ưu tiên cao hơn hiệu suất trong trường hợp này. Ngay cả khi IIF hiệu quả hơn, nó chỉ đơn giản là ít dễ đọc đối với đối tượng mục tiêu (Tôi giả sử nếu bạn đang làm việc trong Visual Basic, bạn muốn các lập trình viên khác có thể đọc mã của bạn dễ dàng, đó là lợi ích lớn nhất của VB ... và mà bị mất với các khái niệm như IIF theo ý kiến của tôi).
Ngoài ra, "IIF là một hàm, so với IF là một phần của cú pháp ngôn ngữ" ... điều này ngụ ý với tôi rằng, thực sự, If sẽ nhanh hơn ... nếu không có gì khác hơn là câu lệnh If có thể được rút gọn trực tiếp đến một tập hợp nhỏ các mã quang thay vì phải đi đến một không gian khác trong bộ nhớ để thực hiện logic được tìm thấy trong chức năng đã nói. Đó là một sự khác biệt nhỏ, có lẽ, nhưng đáng chú ý.
Tôi tin rằng sự khác biệt chính giữa If và IIf là:
Nếu (test [boolean], statement1, statement2) thì có nghĩa là theo giá trị thử nghiệm, satement1 hoặc statement2 sẽ được thực thi (chỉ một câu lệnh sẽ thực thi)
Dim obj = IIF (test [boolean], statement1, statement2) có nghĩa là cả hai câu lệnh sẽ thực thi nhưng theo giá trị thử nghiệm, một trong số chúng sẽ trả về giá trị là (obj).
vì vậy nếu một trong các câu lệnh sẽ ném một ngoại lệ, nó sẽ ném nó vào (IIf) nhưng trong (If), nó sẽ ném nó chỉ trong trường hợp điều kiện sẽ trả về giá trị của nó.
... về lý do tại sao có thể mất tới 6 lần, hãy trả lời wiki:
Bởi vì IIf là một hàm thư viện, nó sẽ luôn yêu cầu chi phí của một lệnh gọi hàm, trong khi toán tử có điều kiện sẽ tạo ra mã nội tuyến nhiều hơn.
Về cơ bản, IIf tương đương với toán tử bậc ba trong C ++ / C #, vì vậy nó cung cấp cho bạn một số câu lệnh kiểu if / else 1 dòng tuyệt vời nếu bạn muốn. Bạn cũng có thể cung cấp cho nó một chức năng để đánh giá nếu bạn muốn.
Các chức năng đó khác nhau! Có lẽ bạn chỉ cần sử dụng câu lệnh IF. IIF sẽ luôn chậm hơn, vì nó sẽ thực hiện cả hai chức năng cộng với nó sẽ thực hiện câu lệnh IF tiêu chuẩn.
Nếu bạn đang tự hỏi tại sao có chức năng IIF, có thể đây sẽ là lời giải thích:
Sub main()
counter = 0
bln = True
s = iif(bln, f1, f2)
End Sub
Function f1 As String
counter = counter + 1
Return "YES"
End Function
Function f2 As String
counter = counter + 1
Return "NO"
End Function
Vì vậy, bộ đếm sẽ là 2 sau này, nhưng s sẽ chỉ là "CÓ". Tôi biết công cụ bộ đếm này là vô dụng, nhưng đôi khi có những hàm mà bạn sẽ cần cả hai để chạy, không quan trọng IF đúng hay sai và chỉ cần gán giá trị từ một trong số chúng cho biến của bạn.
IIf()
theo cách này sẽ chỉ gây nhầm lẫn cho mọi người khi đọc mã của bạn.
IIf
.