我知道以前有人問過類似的問題:
- VB.NET 空合并運算子?
- VB.NET 中的合并運算子和條件運算子
但是我的問題沒有在那里解決。在 C# 中,我可以這樣寫:
return myFoo ??= new Foo()
如果myFoo為 null,則此行將創建一個新的Foo,將其分配給myFoo,并回傳 的值myFoo。
我想把它翻譯成VB。我可以在兩個陳述句中做到這一點,例如:
If myFoo Is Nothing Then myFoo = New Foo()
Return myFoo
甚至使用兩個引數的If函式:
myFoo = If(myFoo, New Foo())
Return myFoo
我寧愿在一份宣告中做到這一點。這看起來應該等同于 C# 版本:
Return myFoo = If(myFoo, New Foo())
但它不起作用,因為它將 解釋=為比較器,而不是分配。
有沒有優雅的解決方案?
uj5u.com熱心網友回復:
C 繼承語言(包括 C#)歷來將賦值視為運算式,這意味著它有結果。從歷史上看,該結果是分配的值。這具有優勢,其中包括允許更簡潔的多個賦值和條件句中的賦值測驗結果。它也有缺點,包括條件中的賦值和相等運算子的潛在混淆。
其他語言將賦值視為一個陳述句,這意味著它沒有結果并且不能組合到另一個操作中。VB 是其中一種語言(其他包括 Fortran 和 Pascal)。
因為賦值是 VB 中的一個陳述句,所以你不能在同一個操作中賦值和測驗,除非你撰寫自己的函式來這樣做。您將不得不進行兩行操作,或者使用:陳述句分隔符將兩個陳述句放在一行上。
對與語言系列相關的 VB 的空閑好奇:在.NET 之前,VB 與 Fortran 的共同點比 C 多得多。結束塊陳述句遵循與 Fortran 相同的約定,代碼編輯器將識別EndIf并將其轉換為End If陣列布局是相同的(列優先而不是行優先),并且代碼編輯器將識別雙精度常量的 Fortran 約定,例如1.0d0將被視為 double 1.0。隨著遷移到 .NET,最后兩個已經丟失。
uj5u.com熱心網友回復:
試試這個:
Return IIf(myFoo IsNot Nothing, myFoo, New Foo())
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/415361.html
標籤:
