1 người đang xem

Pussy

New Member
Bài viết: 950 Tìm chủ đề
864 864
Đ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.
  1. Thực hiện cả 2 hàm b() và c()
  2. 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:

Mã:
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

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

Mã:
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

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:

Mã:
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.
 
Last edited by a moderator:

Users who are viewing this thread

Back