[英]VB.NET: Combining assignments (operator syntax)
看一下这个VB.NET代码:
list = GeoController.RegionByCountry(country, language)
Region.allByLanguage(key) = list
在C#中,我可以写成一行:
Region.allByLanguage[key] =
(list = GeoController.RegionByCountry(country, language))
有没有办法像在C#中那样在VB.NET中使它成为单一样式?
编辑:你们都必须睡一觉,否则您可能会想一点点。
Region.allByLanguage
是一个缓存。
这里是上下文:
Dim list As IEnumerable(Of Region)
Dim key = Region.CacheKey(country, language)
If Region.allByLanguage.ContainsKey(key) Then
list = Region.allByLanguage(key)
Else
list = GeoController.RegionsByCountryAndLanguage(country, language)
Region.allByLanguage(key) = list
End If
Return list
您怎么能告诉我这不是冗长的代码? 颤抖 。
哎呀,如果这是一个C#团队,我会写:
return Region.allByLanguage.ContainsKey(key) ?
Region.allByLanguage[key] :
(Region.allByLanguage[key] = GeoController.RegionsByCountryAndLanguage(country, language));
您实际上还需要访问list
实例吗? 如果不是,为什么不这样写呢?
Region.allByLanguage[key] = GeoController.RegionByCountry(country, language));
您的语法对于C#来说似乎也很奇怪,而且我认为许多人不会以这种方式编写该代码。
另外,如果这样做会使代码的可读性降低,那么减少代码行数本身也不是目标。
如果您同时分配给Region.allByLanguage[key]
和list
,那么如果我要阅读您的代码,我希望使用两行代码。 将这两种分配合并在一行代码中似乎是充其量,并且可能会使读者不知道该list
以及Region.allByLanguage[key]
也已分配。
作为替代方案,除非您的缓存很大,或者要做一些重量级的事情,否则我只需将代码更改为以下内容:
Dim key = Region.CacheKey(country, language)
If not Region.allByLanguage.ContainsKey(key) Then
Region.allByLanguage(key) = GeoController.RegionsByCountryAndLanguage(country, language)
End If
Return Region.allByLanguage(key)
这样,您可以避免单行分配的需要,并且仍然可以减少代码行数。 如果性能出现问题,您可以将其重构。
在VB.NET中,您不能分配一个变量,也不能将该相同的变量分配给另一个变量。
在您的代码中,您正在将GeoController.RegionByCountry(country, language)
分配给list
,然后将list
分配给Region.allByLanguage[key]
在大多数情况下,这不是一件好事,因为它会使您的代码更难阅读。 如果稍后要在子例程中使用list
变量,则最好采用VB方式; 明确分配list
,然后将其分配给区域。 如果您以后不打算使用它,则只需立即分配GeoController.RegionByCountry(country, language)
结果,并跳过对list
变量的临时分配。
但是,如果您坚持使用“单一代码” ,则可以使用一段时间前尝试将某些C#代码移植到VB.NET时被迫编写的代码:
<Extension()> Public Function AssignAndReturn(Of T)(ByVal source As T, ByRef target As T) As T
target = source
Return target
End Function
您可以这样使用它:
Region.allByLanguage(key) = GeoController.RegionByCountry(country, language).AssignAndReturn(list)
它评估GeoController.RegionByCountry(country, language)
,将其分配给list
,然后返回结果; 这是list
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.