Lập trình VB.Net

Sự khác nhau giữa If và IIf là gì ?

Sự khác nhau giữa If và IIf là gì ?
Được viết bởi Minh Hoàng

Series lập trình VB.NET, ngôn ngữ lập trình hướng đối tượng .NET Framework

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.

  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 IIfIf 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 IIfIf. 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.

Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi!

Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp bạn đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[...]

Translate »