Sự Khác Nhau Giữa If Và Iif Là Gì?

Thảo luận trong 'Tài Liệu' bắt đầu bởi Pussy, Thg 11 11, 2016.

  1. Pussy

    Pussy New Member Chuyển tiền Tìm chủ đề

    Bài viết:
    Tìm chủ đề
    950
    Đ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: Thg 4 2, 2018
  2. Đang tải...
Trả lời qua Facebook

Chia sẻ trang này