Có VB.NET tương đương với ??
toán tử của C # không?
Có VB.NET tương đương với ??
toán tử của C # không?
Câu trả lời:
Sử dụng If()
toán tử với hai đối số ( tài liệu Microsoft ):
' Variable first is a nullable type.
Dim first? As Integer = 3
Dim second As Integer = 6
' Variable first <> Nothing, so its value, 3, is returned.
Console.WriteLine(If(first, second))
second = Nothing
' Variable first <> Nothing, so the value of first is returned again.
Console.WriteLine(If(first, second))
first = Nothing second = 6
' Variable first = Nothing, so 6 is returned.
Console.WriteLine(If(first, second))
If()
tuyên bố trong VB giống như if...?...:
trong C #, không phải là ??
toán tử
??
(xem câu trả lời khác cho câu hỏi này: stackoverflow.com/a/20686360/1474939 )
If
với ba tham số . Điều đó không giống với ??
toán tử của C # . Câu trả lời tốt hơn là Code Maverick's If với hai đối số . (Nick đã có câu trả lời tương tự, nhiều năm trước, nhưng không bao gồm lời giải thích từ MSDN.)
Nhà IF()
điều hành nên thực hiện các mẹo cho bạn:
value = If(nullable, defaultValueIfNull)
Câu trả lời được chấp nhận không có bất kỳ lời giải thích nào và chỉ đơn giản là một liên kết.
Do đó, tôi nghĩ rằng tôi sẽ để lại câu trả lời giải thích cách thức If
hoạt động của toán tử được lấy từ MSDN:
Sử dụng đánh giá ngắn mạch để trả về có điều kiện một trong hai giá trị. Các Nếu nhà điều hành có thể được gọi với ba đối số hoặc với hai đối số.
If( [argument1,] argument2, argument3 )
Đối số đầu tiên thành If có thể được bỏ qua. Điều này cho phép toán tử được gọi bằng cách chỉ sử dụng hai đối số. Danh sách sau chỉ áp dụng khi toán tử If được gọi với hai đối số.
Term Definition
---- ----------
argument2 Required. Object. Must be a reference or nullable type.
Evaluated and returned when it evaluates to anything
other than Nothing.
argument3 Required. Object.
Evaluated and returned if argument2 evaluates to Nothing.
Khi đối số Boolean bị bỏ qua, đối số đầu tiên phải là kiểu tham chiếu hoặc nullable. Nếu đối số thứ nhất ước lượng thành Không có gì , giá trị của đối số thứ hai được trả về. Trong tất cả các trường hợp khác, giá trị của đối số đầu tiên được trả về. Ví dụ sau minh họa cách đánh giá này hoạt động.
' Variable first is a nullable type.
Dim first? As Integer = 3
Dim second As Integer = 6
' Variable first <> Nothing, so its value, 3, is returned.
Console.WriteLine(If(first, second))
second = Nothing
' Variable first <> Nothing, so the value of first is returned again.
Console.WriteLine(If(first, second))
first = Nothing
second = 6
' Variable first = Nothing, so 6 is returned.
Console.WriteLine(If(first, second))
Một ví dụ về cách xử lý nhiều hơn hai giá trị (lồng nhau if
):
Dim first? As Integer = Nothing
Dim second? As Integer = Nothing
Dim third? As Integer = 6
' The LAST parameter doesn't have to be nullable.
'Alternative: Dim third As Integer = 6
' Writes "6", because the first two values are "Nothing".
Console.WriteLine(If(first, If(second, third)))
Bạn có thể sử dụng một phương pháp mở rộng. Cái này hoạt động giống như SQL COALESCE
và có thể là quá mức cần thiết cho những gì bạn đang cố kiểm tra, nhưng nó hoạt động.
''' <summary>
''' Returns the first non-null T based on a collection of the root object and the args.
''' </summary>
''' <param name="obj"></param>
''' <param name="args"></param>
''' <returns></returns>
''' <remarks>Usage
''' Dim val as String = "MyVal"
''' Dim result as String = val.Coalesce(String.Empty)
''' *** returns "MyVal"
'''
''' val = Nothing
''' result = val.Coalesce(String.Empty, "MyVal", "YourVal")
''' *** returns String.Empty
'''
''' </remarks>
<System.Runtime.CompilerServices.Extension()> _
Public Function Coalesce(Of T)(ByVal obj As T, ByVal ParamArray args() As T) As T
If obj IsNot Nothing Then
Return obj
End If
Dim arg As T
For Each arg In args
If arg IsNot Nothing Then
Return arg
End If
Next
Return Nothing
End Function
Tích hợp If(nullable, secondChoice)
chỉ có thể xử lý hai lựa chọn nullable. Ở đây, người ta có thể có Coalesce
nhiều tham số như mong muốn. Cái không null đầu tiên sẽ được trả về và phần còn lại của các tham số không được đánh giá sau đó (ngắn gọn, như AndAlso
/ &&
và OrElse
/ ||
)
Return args.FirstOrDefault(Function(arg) arg IsNot Nothing)
:-)
Một hạn chế đáng kể của hầu hết các giải pháp này là chúng sẽ không bị đoản mạch. Do đó chúng không thực sự tương đương với ??
.
Việc xây dựng trong If
điều hành sẽ không đánh giá các thông số tiếp theo trừ khi đánh giá lại số trước đó để không có gì.
Các câu sau đây là tương đương:
C #
var value = expression1 ?? expression2 ?? expression3 ?? expression4;
VB
dim value = if(expression1,if(expression2,if(expression3,expression4)))
Điều này sẽ làm việc trong tất cả các trường hợp ??
làm việc. Bất kỳ giải pháp nào khác sẽ phải được sử dụng hết sức thận trọng, vì chúng có thể dễ dàng đưa ra các lỗi thời gian chạy.
Kiểm tra tài liệu của Microsoft về If Toán tử (Visual Basic) tại đây: https://docs.microsoft.com/en-us/dotnet/visual-basic/lingu-reference/operators/if-operator
If( [argument1,] argument2, argument3 )
Dưới đây là một số ví dụ (VB.Net)
' This statement prints TruePart, because the first argument is true.
Console.WriteLine(If(True, "TruePart", "FalsePart"))
' This statement prints FalsePart, because the first argument is false.
Console.WriteLine(If(False, "TruePart", "FalsePart"))
Dim number = 3
' With number set to 3, this statement prints Positive.
Console.WriteLine(If(number >= 0, "Positive", "Negative"))
number = -1
' With number set to -1, this statement prints Negative.
Console.WriteLine(If(number >= 0, "Positive", "Negative"))