Recentemente ho spostato da VB a C#, quindi uso spesso un convertitore C# in VB.NET per capire le differenze di sintassi. Spostando il prossimo metodo su VB ho notato una cosa interessante.L'operatore C# ++ diventa thread-safe nel ciclo foreach?
C# codice originale: risultato
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# 's ++
operatore sostituita con System.Threading.Interlocked.Increment
Vuol dire che non threadsafe ++
operatore diventare threadsafe se utilizzato in foreach
ciclo? È una specie di zucchero sintassi? Se questo è vero, allora perché il convertitore ha posizionato Interlocked.Increment
nella versione VB? Ho pensato che foreach sia in C che in VB funziona esattamente allo stesso modo. O è solo un convertitore "assicurazione"?
Chiedo se c'è un sovraccarico, ad esempio ++ vs interlock. –
@Steve 'Interlock.Increment' è un po 'più lento, perché introduce una fence di memoria. Ma la differenza non sarà evidente a meno che non si abbia a che fare con codice ad alte prestazioni, nel qual caso probabilmente non lo si auto-convertirà comunque. –