VB 等效于 C# 空合并运算符 - 特定情况
VB equivalent of C# null coalescing operator - specific case
我知道之前有人问过类似的问题:
- VB.NET null coalescing operator?
- Coalesce operator and Conditional operator in VB.NET
但那里没有解决我的问题。在 C# 中我可以这样写:
return myFoo ??= new Foo()
如果myFoo
为null,这一行将创建一个新的Foo
,将其分配给myFoo
、和 return 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())
但它不起作用,因为它将 =
解释为比较器,而不是赋值。
有没有优雅的解决方案?
C 继承语言(包括 C#)历来将赋值视为 表达式,这意味着它有一个结果。从历史上看,该结果是分配的值。这具有优势,包括允许更简洁的多重赋值和测试条件赋值的结果。它也有缺点,包括条件中赋值和相等运算符的潜在混淆。
其他语言将赋值视为语句,这意味着它没有结果并且不能组合成另一个操作。 VB 是其中一种语言(其他语言包括 Fortran 和 Pascal)。
因为赋值是 VB 中的语句,除非您编写自己的函数来这样做,否则您不能在同一操作中进行赋值和测试。您将不得不执行两行操作,或者使用 :
语句分隔符将两个语句放在一行中。
关于 VB 与语言家族相关的闲散好奇心:pre-.NET,VB 与 Fortran 的共同点多于 C。结束块语句遵循与 Fortran 相同的约定,代码编辑器将识别 EndIf
并将其转换为 End If
,数组布局相同(列优先而不是行优先),并且代码编辑器将识别 Fortran 约定的双-精度常数,例如1.0d0
将被视为双 1.0
。最后两个随着迁移到 .NET 而丢失。
我知道之前有人问过类似的问题:
- VB.NET null coalescing operator?
- Coalesce operator and Conditional operator in VB.NET
但那里没有解决我的问题。在 C# 中我可以这样写:
return myFoo ??= new Foo()
如果myFoo
为null,这一行将创建一个新的Foo
,将其分配给myFoo
、和 return 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())
但它不起作用,因为它将 =
解释为比较器,而不是赋值。
有没有优雅的解决方案?
C 继承语言(包括 C#)历来将赋值视为 表达式,这意味着它有一个结果。从历史上看,该结果是分配的值。这具有优势,包括允许更简洁的多重赋值和测试条件赋值的结果。它也有缺点,包括条件中赋值和相等运算符的潜在混淆。
其他语言将赋值视为语句,这意味着它没有结果并且不能组合成另一个操作。 VB 是其中一种语言(其他语言包括 Fortran 和 Pascal)。
因为赋值是 VB 中的语句,除非您编写自己的函数来这样做,否则您不能在同一操作中进行赋值和测试。您将不得不执行两行操作,或者使用 :
语句分隔符将两个语句放在一行中。
关于 VB 与语言家族相关的闲散好奇心:pre-.NET,VB 与 Fortran 的共同点多于 C。结束块语句遵循与 Fortran 相同的约定,代码编辑器将识别 EndIf
并将其转换为 End If
,数组布局相同(列优先而不是行优先),并且代码编辑器将识别 Fortran 约定的双-精度常数,例如1.0d0
将被视为双 1.0
。最后两个随着迁移到 .NET 而丢失。