มีผู้ประกอบการที่ประกอบไปด้วยเงื่อนไขใน VB.NET หรือไม่?


446

ใน Perl (และภาษาอื่น ๆ ) ผู้ประกอบการที่มีเงื่อนไขสามารถแสดงได้ดังนี้:

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

มีผู้ประกอบการที่คล้ายกันใน VB.NET หรือไม่?


13
ตัวดำเนินการที่ประกอบไปด้วยคือตัวดำเนินการใด ๆ ที่ใช้ตัวถูกดำเนินการสามตัวเช่นเดียวกับตัวดำเนินการไบนารีที่ใช้สองตัว ตัวดำเนินการ?: เป็นตัวอย่างเฉพาะของตัวดำเนินการ ternay ไม่ใช่คำจำกัดความ
Zooba

คำตอบ:


597

ขึ้นอยู่กับรุ่น ตัวIfดำเนินการใน VB.NET 2008 เป็นตัวดำเนินการที่ประกอบไปด้วย (รวมถึงตัวดำเนินการรวมกันเป็นโมฆะ) นี่เป็นเพียงการแนะนำก่อนปี 2008 นี้ไม่สามารถใช้ได้ นี่คือข้อมูลเพิ่มเติม: Visual Basic หากประกาศ

ตัวอย่าง:

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

[แก้ไข]

ก่อนหน้าปี 2008 มันเคยเป็นIIfสิ่งที่เกือบจะเหมือนกันกับIfโอเปอร์เรเตอร์ที่อธิบายข้างต้น

ตัวอย่าง:

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

15
ก่อนหน้าปี 2008 มันเป็น IIf ซึ่งทำงานเหมือนกันกับตัวดำเนินการ If ที่อธิบายไว้ในลิงก์ของคุณ
Zooba

128
... ด้วยความแตกต่างที่สำคัญที่ Iif () เป็นฟังก์ชันจะประเมินทั้งผลลัพธ์และทางเลือกเสมอในขณะที่ใหม่หากประเมินเพียงหนึ่งในนั้น
Greg Hewgill

6
มันหมายความว่าอะไร? ถ้า (เงื่อนไข, ส่วนจริง, ส่วนเท็จ) ฉันขอพิธีกรรมได้ไหม
kbvishnu

10
ฉันเป็นคน C ขนาดใหญ่ แต่ฉันพบว่าไวยากรณ์นี้สะอาดกว่าผู้ประกอบการแบบดั้งเดิม
บดขยี้

11
ความแตกต่างที่สำคัญอีกประการหนึ่ง: Iifคืนค่าประเภทของวัตถุเสมอObjectในขณะที่If(bool, obj, obj)ช่วยให้การตรวจสอบประเภทด้วยตัวเลือกที่เข้มงวด ( Dim var As Integer = Iif(true, 1, 2)จะไม่คอมไพล์ด้วยตัวเลือกที่เข้มงวดเพราะคุณสามารถเขียนได้อย่างง่ายดายDim var As Integer = Iif(true, new Object(), new Object())คุณสามารถเขียนDim var As Integer = If(true, 1, 2)ด้วยตัวเลือกที่เข้มงวดได้เนื่องจากจะตรวจสอบประเภทที่ส่งคืน)
Joseph Nields

78

iif มีให้บริการใน VB เสมอแม้ใน VB6

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

ไม่ใช่ตัวดำเนินการจริงเช่นนั้น แต่ฟังก์ชันใน namespace Microsoft.VisualBasic


31
Iif นั้นอยู่ใกล้กับผู้ประกอบการเท่านั้น - ซึ่งหมายความว่าคุณไม่สามารถใช้มันได้ในทุกสภาวะที่คุณต้องการหากเป็น If If Else (หรือผู้ประกอบการที่สาม) ตัวอย่างเช่น Value = Iif (1 = 1, 0, 1/0) จะระเบิด แต่ Value = ถ้า (1 = 1, 0, 1/0) จะไม่ ...
Beep beep

4
VB ไม่รองรับการประเมินผลการลัดวงจร (ยกเว้นสำหรับตัวดำเนินการ AndAlso) ดังนั้นโปรแกรมเมอร์ VB จึงไม่คาดหวังว่าพวกเขาจะสามารถประเมินการทำงานครึ่งหนึ่งได้อย่างปลอดภัย แต่ประเด็นก็คือถ้ามีฟังก์ชั่นการแฮ็คที่ถูกใส่เข้าไปในความเข้ากันได้แบบย้อนหลังมิฉะนั้นมันจะเป็นผู้ดำเนินการจริง
คริสเอริก

39
ยินดีที่จะจัดหมวดหมู่โปรแกรมเมอร์ VB ทั้งหมด ;-) และยังมี IsNot และ OrElse เป็นทางลัดดังนั้น VB จึงรองรับการประเมินผลแบบลัดวงจร
HardCode

2
Iif เป็นการเรียกเมธอดปกติและประเมินพารามิเตอร์ทั้งหมด มันไม่ได้เป็นแบบไตรภาค Se dotnetslackers.com/VB_NET/…
LosManos

3
ดังที่ฉันได้กล่าวไว้มันไม่ได้เป็นโอเปอเรเตอร์ที่แท้จริงและ vb6 ไม่รองรับการประเมินการลัดวงจรดังนั้นจึงประเมินการดำเนินงานทั้งหมดในบรรทัดอยู่เสมอ
Kris Erickson

23

หาก () ใกล้เคียงที่สุด แต่ระวังการแปลงโดยนัยที่เกิดขึ้นหากคุณตั้งค่า "Option Strict off"

ตัวอย่างเช่นหากคุณไม่ระวังคุณอาจต้องลองทำสิ่งต่อไปนี้

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

จะให้ค่า "foo" เป็น 0!

ฉันคิดว่า '?' ตัวดำเนินการเทียบเท่าใน C # จะล้มเหลวในการรวบรวมแทน


8
Dim foo As Integer? = If( someTrueExpression, New Integer?, 2)เพียงเพื่อความสมบูรณ์ในทางที่ดีขึ้นในการเขียนการแสดงออกที่เป็น
Mark Hurd

9
Option Strict Onหมายเหตุว่าเรื่องนี้ก็เกิดขึ้นกับ เหตุผลก็คือว่าNothingใน VB.NET เทียบเท่ากับ C # 's มากกว่าที่จะdefault(T) null
Heinzi

1
และสำหรับทุกคนที่ทำให้งงInteger?ก็หมายความว่ามันเป็น
โมฆะ

1
สำหรับใครก็ตามที่ติดอยู่กับการแปลงโดยนัยสำหรับประเภท nullable - ดูคำตอบว่าทำไมและคำตอบนี้สำหรับวิธีแก้ปัญหาที่ปลดเปลื้องอาร์กิวเมนต์ก่อนส่งคืน ( CType(Nothing, DateTime?)
KyleMit
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.