繁体   English   中英

VB.NET:组合分配(运算符语法)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM