“Uma referência a um campo volátil não será tratado como implicações voláteis”
-
06-07-2019 - |
Pergunta
O código a seguir
using System.Threading;
class Test
{
volatile int counter = 0;
public void Increment()
{
Interlocked.Increment(ref counter);
}
}
Levanta o seguinte aviso do compilador:
"A reference to a volatile field will not be treated as volatile"
Estou fazendo algo errado aqui para levantar esse aviso? Por que o compilador me avisa sobre isso?
Solução
Você não está fazendo nada de errado. De acordo com documentação:
Um campo volátil normalmente não deve ser passado usando um parâmetro REF ou OUT, pois não será tratado como volátil dentro do escopo da função. Há exceções a isso, como ao chamar uma API interligada.
Outras dicas
Basicamente, o aviso é que, quando você passa em um campo volátil por referência, o código de chamada não sabe tratá -lo de maneira volátil. Para intertraar -se. de qualquer forma Se você está usando interligado.
Em geral, acho que evitaria misturar os dois - se você estiver usando interligado, faça -o em toda parte (usando Interlocked.CompareExchange(ref counter, 0, 0)
para ler). Não posso dizer que uso volátil com muita frequência, pessoalmente. Para contadores simples eu poderia Use interligado, mas tenho mais probabilidade de usar um bloqueio para a maioria das tarefas.
Usa isto:
#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
Você está recebendo o erro porque está passando pelo campo por referência. Eu acho que o que isso significa é que o método de destino não tem idéia de que o campo está marcado como volatile
, e, portanto, não o tratará como tal.