Có một toán tử ternary có điều kiện trong VB.NET không?


446

Trong Perl (và các ngôn ngữ khác), một toán tử ternary có điều kiện có thể được biểu diễn như sau:

my $foo = $bar == $buz ? $cat : $dog;

Có một toán tử tương tự trong VB.NET không?


13
Toán tử ternary là bất kỳ toán tử nào có ba toán hạng, giống như toán tử nhị phân mất hai và toán tử đơn nguyên lấy một toán tử. Toán tử ?: Là một ví dụ cụ thể của toán tử ternay, không phải định nghĩa.
Zooba

Câu trả lời:


597

Phụ thuộc vào phiên bản. Các Ifnhà điều hành trong VB.NET 2008 là một nhà điều hành ternary (cũng như một nhà điều hành kết dính null). Điều này chỉ mới được giới thiệu, trước năm 2008 này không có sẵn. Dưới đây là một số thông tin: Visual Basic If thông báo

Thí dụ:

Dim foo as String = If(bar = buz, cat, dog)

[BIÊN TẬP]

Trước năm 2008, nó đã IIfhoạt động gần như giống hệt với Iftoán tử được mô tả ở trên.

Thí dụ:

Dim foo as String = IIf(bar = buz, cat, dog)

15
Trước năm 2008, nó là IIf, hoạt động gần như giống hệt với toán tử If được mô tả trong liên kết của bạn.
Zooba

128
... Với sự khác biệt quan trọng mà Iif (), là một hàm, luôn đánh giá cả hệ quả và phương án, trong khi If mới chỉ đánh giá một trong số chúng.
Greg Hewgill

6
Nó có nghĩa là gì ? Nếu (điều kiện, phần đúng, phần sai). tôi có thể nghi thức không
kbvishnu

10
Tôi là một anh chàng C khổng lồ, nhưng tôi thấy cú pháp này sạch hơn so với toán tử ternary truyền thống.
nghiền nát

11
Một phân biệt quan trọng khác: Iifluôn trả về một đối tượng kiểu Object, trong khi If(bool, obj, obj)cho phép kiểm tra kiểu với tùy chọn nghiêm ngặt trên. ( Dim var As Integer = Iif(true, 1, 2)sẽ không biên dịch với tùy chọn nghiêm ngặt vì bạn có thể dễ dàng viết Dim var As Integer = Iif(true, new Object(), new Object()). Bạn có thể viết Dim var As Integer = If(true, 1, 2)với tùy chọn nghiêm ngặt mặc dù vì nó sẽ kiểm tra loại được trả về.)
Joseph Nields

78

iif luôn có sẵn trong VB, ngay cả trong VB6.

Dim foo as String = iif(bar = buz, cat, dog)

Nó không phải là một toán tử thực sự, như vậy, nhưng là một chức năng trong không gian tên Microsoft.VisualBasic.


31
Iif chỉ gần với một toán tử ternary - điều đó có nghĩa là bạn không thể sử dụng nó trong mọi điều kiện mà bạn sẽ sử dụng If Then Else (hoặc toán tử ternary). Ví dụ: Giá trị = Iif (1 = 1, 0, 1/0) sẽ nổ tung, nhưng Giá trị = Nếu (1 = 1, 0, 1/0) sẽ không ...
Bíp bíp

4
VB không hỗ trợ đánh giá Mạch ngắn (ngoại trừ toán tử AndAlso), vì vậy các lập trình viên VB không thực sự mong đợi rằng họ có thể đánh giá một nửa hoạt động một cách an toàn. Nhưng quan điểm, iif là một chức năng hack được đưa vào để tương thích ngược nếu không nó sẽ là một nhà điều hành thực sự.
Kris Erickson

39
Rất vui để phân loại tất cả các lập trình viên VB ;-) Và cũng có IsNot và OrElse để tắt, vì vậy VB thực sự hỗ trợ Đánh giá Mạch ngắn.
HardCode

2
Iif là một cuộc gọi phương thức thông thường và đánh giá tất cả các tham số. Nó không phải là chim nhạn. Se dotnetslackers.com/VB_NET/ cường
LosManos

3
Như tôi đã nói, nó KHÔNG phải là một toán tử thực sự và vb6 không hỗ trợ đánh giá ngắn mạch vì vậy nó luôn luôn đánh giá tất cả các hoạt động trên đường dây.
Kris Erickson

23

Nếu () là tương đương gần nhất nhưng hãy cẩn thận với các chuyển đổi ngầm đang diễn ra nếu bạn đã đặt "Tắt tùy chọn"

Ví dụ: nếu không cẩn thận, bạn có thể muốn thử một cái gì đó như:

Dim foo As Integer? = If( someTrueExpression, Nothing, 2)

Sẽ cho "foo" giá trị 0!

Tôi nghĩ rằng '?' toán tử tương đương trong C # thay vì thất bại trong việc biên dịch


8
Chỉ cần cho đầy đủ, cách tốt hơn để viết biểu thức đó là Dim foo As Integer? = If( someTrueExpression, New Integer?, 2).
Đánh dấu Hurd

9
Lưu ý rằng điều này cũng xảy ra với Option Strict On. Lý do là Nothingtrong VB.NET tương đương với C # default(T)chứ không phải null.
Heinzi

1
Và đối với bất kỳ ai bối rối bởi Integer?điều đó có nghĩa là nó không thể thực hiện được - hãy xem stackoverflow.com/questions/3628757/make-an-integer-null
AjV Jsy

1
Đối với bất kỳ ai bị mắc kẹt trong chuyển đổi ngầm định cho các loại nullable - hãy xem câu trả lời này về lý docâu trả lời này cho một cách giải quyết để đưa ra đối số trước khi trả về ( CType(Nothing, DateTime?).
KyleMit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.