VB.NET:组合赋值(运算符语法)

时间:2011-03-01 08:10:42

标签: c# vb.net

看看这个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));

3 个答案:

答案 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