"Ein Hinweis auf ein flüchtiges Feld wird nicht als flüchtige Auswirkungen behandelt
-
06-07-2019 - |
Frage
Der folgende Code
using System.Threading;
class Test
{
volatile int counter = 0;
public void Increment()
{
Interlocked.Increment(ref counter);
}
}
Wirkt die folgende Compiler -Warnung an:
"A reference to a volatile field will not be treated as volatile"
Mache ich hier etwas falsch, um diese Warnung zu erheben? Warum warnt der Compiler mich davor?
Lösung
Du machst nichts falsch. Laut dem Dokumentation:
Ein flüchtiges Feld sollte normalerweise nicht unter Verwendung eines Ref oder OUT -Parameters bestanden werden, da es im Rahmen der Funktion nicht als flüchtig behandelt wird. Es gibt Ausnahmen, beispielsweise beim Aufrufen einer Verriegelungs -API.
Andere Tipps
Grundsätzlich ist die Warnung, dass der Anrufcode, wenn Sie ein flüchtiges Feld durch Bezugnahme durch Referenz bestehen, nicht weiß, dass er es auf volatile Weise behandelt. Für Interclocked.inkrement, das aufgrund der Art der Methode wahrscheinlich keine Rolle spielt - aber dann müssen Sie die Variable nicht flüchtig sein ohnehin Wenn Sie Interlocked verwenden.
Im Allgemeinen denke ich, dass ich es vermeiden würde, die beiden zu mischen - wenn Sie Interlocked verwenden, tun Sie es überall, überallhin, allerorts (Verwendung Interlocked.CompareExchange(ref counter, 0, 0)
es lesen). Ich kann nicht sagen, dass ich sehr oft volatile, persönlich benutze. Für einfache Zähler i könnte Verwenden Sie Interlocked, aber ich verwende für die meisten Aufgaben eher ein Schloss.
Benutze das:
#pragma warning disable 420
// M
// dM
// MMr
// 4MMML .
// MMMMM. xf
// . "MMMMM .MM-
// Mh.. +MMMMMM .MMMM
// .MMM. .MMMMML. MMMMMh
// )MMMh. MMMMMM MMMMMMM
// 3MMMMx. 'MMMMMMf xnMMMMMM"
// '*MMMMM MMMMMM. nMMMMMMP"
// *MMMMMx "MMMMM\ .MMMMMMM=
// *MMMMMh "MMMMM" JMMMMMMP
// MMMMMM 3MMMM. dMMMMMM .
// MMMMMM "MMMM .MMMMM( .nnMP"
// =.. *MMMMx MMM" dMMMM" .nnMMMMM*
// "MMn... 'MMMMr 'MM MMM" .nMMMMMMM*"
// "4MMMMnn.. *MMM MM MMP" .dMMMMMMM""
// ^MMMMMMMMx. *ML "M .M* .MMMMMM**"
// *PMMMMMMhn. *x > M .MMMM**""
// ""**MMMMhx/.h/ .=*"
// .3P"%....
// nP" "*MMnx
if(Interlocked.CompareExchange(ref isLoaded, 1, 0) != 0)
return;
#pragma warning restore 420
Sie erhalten den Fehler, weil Sie das Feld durch Referenz übergeben. Ich denke, dies bedeutet, dass die Zielmethode keine Ahnung hat, dass das Feld als markiert ist volatile
, und wird es daher nicht als solche behandeln.