看看这个VB.NET代码:
list = GeoController.RegionByCountry(country, language)
Region.allByLanguage(key) = list
在C#中,我可以写一行:
Region.allByLanguage[key] =
(list = GeoController.RegionByCountry(country, language))
有没有办法让它成为VB.NET中的一行代码,就像我在C#中一样?
编辑:你们都需要睡一觉,否则你可能会想得更加困难。
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));
答案 0 :(得分:7)
您是否真的需要访问list
实例?如果没有,为什么不这样写呢?
Region.allByLanguage[key] = GeoController.RegionByCountry(country, language));
对于C#,你的语法似乎也很奇怪,我认为很多人不会那样编写代码。
此外,减少代码行数本身并不是一个目标,如果它使代码的可读性降低,就像你在这种情况下尝试的那样。
如果您要同时分配Region.allByLanguage[key]
和list
,如果我要阅读您的代码,我会更喜欢两行代码。在一行代码中合并两个分配似乎是最好的,并且读者可能没有意识到list
被分配以及Region.allByLanguage[key]
。
答案 1 :(得分:1)
作为替代方案,除非您的缓存很大或做重量级的事情,否则我只想将代码更改为:
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)
通过这种方式,您可以避免单行分配,并且仍然可以减少代码行。如果性能成为问题,您可以将其重构出来。
答案 2 :(得分:0)
在VB.NET中,您无法分配变量并将相同的变量分配给另一个变量。
在您的代码中,您要将GeoController.RegionByCountry(country, language)
分配给list
,然后将list
分配给Region.allByLanguage[key]
在大多数情况下,这不是一件好事,因为它会使您的代码更难以阅读。
如果您打算稍后在子例程中使用list
变量,最好采用VB方式;明确指定list
,然后将其分配给该地区。如果您以后不打算使用它,则只需立即分配GeoController.RegionByCountry(country, language)
的结果,并跳过临时分配到list
变量。
如果你坚持,但是在'one-liner'上,你可以使用这段代码,当我试图将一些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
。