1. Điểm khác nhau thứ 1
Chúng ta cùng phân tích ví dụ bên dưới:
■ x = IIF(a, b(), c())
Trường hợp dùng IIf thì CẢ 2 hàm b() và c() đều được thực hiện, mà không quan tâm biểu thức điều kiện a là True hay False.
- Thực hiện cả 2 hàm b() và c()
- Thực hiện gán giá trị cho x
- Nếu biểu thức điều kiện a = True, thì gán x = kết quả của hàm b()
- Ngược lại, nếu biểu thức điều kiện a = False, thì gán x = kết quả của hàm c()
■ x = If(a, b(), c())
Trường hợp dùng If thì CHỈ 1 trong 2 hàm b() hoặc c() được thực hiện tùy theo biểu thức điều kiện a là True hay False
- Nếu biểu thức điều kiện a = True, thì thực hiện hàm b() rồi gán kết quả cho x
- Ngược lại, nếu biểu thức điều kiện a = False, thì thực hiện hàm c() rồi gán kết quả cho x
2. Điểm khác nhau thứ 2
– Một sự khác biệt rất quan trọng giữa IIf và If là việc chuyển đổi ngầm định kiểu dữ liệu đối với trường hợp kết quả trả về là Nothing
- IIf : Luôn return giá trị mặc định của kiểu Object là Nothing
- If : Thì return giá trị mặc định kiểu kiểu dữ liệu tương ứng ( Integer/Double là 0, Boolean là False, String/Char là Nothing,… )
– Minh họa:
Module MinhHoangBlog Sub Main() ' Khai báo 2 biến valIIF, valIf để nhận về kết quả tương ứng của IIf và If Dim valIIF As Object, valIf As Object ' Khai báo biến dùng để kiểm tra Dim val As Integer = -1 ' Thực hiện kiểm tra, xong return kết quả valIIF = IIf(val >= 0, val, Nothing) valIf = If(val >= 0, val, Nothing) ' Trường hợp sử dụng IIf: Nothing sẽ return giá trị mặc định của kiểu Object là Nothing Console.WriteLine("valIIF = " & valIIF) ' Output: valIIF = ' Trường hợp sử dụng If: Nothing sẽ return giá trị mặc định của kiểu Integer là 0 Console.WriteLine("valIf = " & valIf) ' Output: valIf = 0 Console.Read() End Sub End Module
3. Sử dụng IIf kém an toàn hơn If(short-circuits)
Từ phân tích trên chúng ta có thể thấy sử dụng IIf có hiệu suất chậm hơn và đôi khi kém an toàn hơn so với sử dụng If
Module MinhHoangBlog Sub Main() 'Dim str As String = "Hello World" Dim str As String ' Vì biểu thức điều kiện「str Is Nothing」là True nên KHÔNG THỰC HIỆN lệnh「str.Length」 Console.WriteLine("strLength = {0}", If(str Is Nothing, "N/A", str.Length)) ' Output: strLength = N/A ' Xảy ra lỗi: System.NullReferenceException, khi thực hiện lệnh「str.Length」 Console.WriteLine("strLength = {0}", IIf(str Is Nothing, "N/A", str.Length)) Console.Read() End Sub End Module
4. Vậy tại sao lại có IIf ? Dùng IIf trong trường hợp nào ?
Chúng ta cùng xem một ví dụ bên dưới:
Module MinhHoangBlog Dim counter As Integer = 0 Sub Main() Dim isCondition As Boolean = True Dim str As String = IIf(isCondition, func1, func2) Console.WriteLine("counter = {0}", counter) ' Output: counter = 2 Console.WriteLine("str = {0}", str) ' Output: str = YES Console.Read() End Sub Function func1() As String counter = counter + 1 Return "YES" End Function Function func2() As String counter = counter + 1 Return "NO" End Function End Module
– Sau khi chạy xong đoạn lệnh trên thì chúng ta sẽ nhận được counter = 2, và str = YES.
– Ở đây việc tính toán counter là không cần thiết, nhưng đôi khi có những chức năng mà bạn sẽ cần/muốn cả 2 hàm cùng chạy, không quan trọng điều kiện của IF là True hay False. Có thể kết quả từ biến counter này sẽ dùng vào một việc khác trong chương trình sau này.
Kết luận:
Như vậy chúng ta đã cùng nhau tìm hiểu sự khác nhau và những đặc điểm của 2 câu lệnh điều kiện IIf và If. Tùy vào tình huống cụ thể mà chúng ta sử dụng linh hoạt 2 câu lệnh điều kiện này.