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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top