最近我從VB轉移到C#,所以我經常使用C#to VB.NET轉換器來理解語法差異。 雖然移動下一個方法到VB我注意到一個有趣的事情。C#++運算符是否在foreach循環中變爲線程安全?
C#原代碼:
public bool ExceedsThreshold(int threshold, IEnumerable<bool> bools)
{
int trueCnt = 0;
foreach(bool b in bools)
if (b && (++trueCnt > threshold))
return true;
return false;
}
VB.NET結果:
Public Function ExceedsThreshold(threshold As Integer, bools As IEnumerable(Of Boolean)) As Boolean
Dim trueCnt As Integer = 0
For Each b As Boolean In bools
If b AndAlso (System.Threading.Interlocked.Increment(trueCnt) > threshold) Then
Return True
End If
Next
Return False End Function
C#的++
運營商System.Threading.Interlocked.Increment
更換這是否意味着如果foreach
循環使用的不是線程安全的++
操作成爲線程?它是一種語法糖嗎?如果這是真的,那麼爲什麼轉換器在VB版本中放置Interlocked.Increment
?我認爲C#和VB中的foreach完全一樣。或者它只是一個轉換器「保險」?
不知道是否有任何開銷,例如++與互鎖。 – 2015-04-04 18:23:10
@Steve'Interlock.Increment'有點慢,因爲它引入了一個內存圍欄。但是,除非你處理非常高性能的代碼,否則這種差異不會引起注意,在這種情況下,你可能不會自動轉換它。 – 2015-04-04 18:25:38