Una domanda come la mia è stata asked, ma la mia è un po 'diversa. La domanda è: "Perché la parola chiave volatile non è consentita in C#
sui tipi System.Double
e System.Int64
, ecc.?"Perché non volatile su System.Double e System.Long?
In un primo momento, ho risposto al mio collega, "Beh, su una macchina a 32 bit, quei tipi richiedono almeno due zecche per entrare anche nel processore, e il framework .Net ha l'intenzione di astrarre via il processore specifico dettagli del genere. " A cui risponde, "Non sta astratizzando nulla se ti impedisce di usare una funzione a causa di un problema specifico del processore!"
Sta implicando che un dettaglio specifico del processore non deve apparire a una persona che utilizza un framework che "astrae" dettagli del genere dal programmatore. Quindi, il framework (o C#) dovrebbe allontanare quelli e fare ciò che deve fare per offrire le stesse garanzie per System.Double
, ecc. (Sia che si tratti di un semaforo, di una barriera di memoria o di qualsiasi altra cosa). Ho sostenuto che il framework non dovrebbe aggiungere il sovraccarico di un semaforo su volatile
, perché il programmatore non si aspetta un sovraccarico con tale parola chiave, perché un semaforo non è necessario per i tipi a 32 bit. Il sovraccarico maggiore per i tipi a 64 bit potrebbe essere una sorpresa, quindi, per il framework .Net, è meglio non permetterlo e farti fare il tuo semaforo su tipi più grandi se il sovraccarico è accettabile.
Ciò ha portato a indagare su cosa sia la parola chiave volatile. (vedi la pagina this). Nella pagina viene riportato, nelle note:
In C#, utilizzando il modificatore volatile su un campo garantisce che tutti gli accessi a tale campo utilizzino VolatileRead o VolatileWrite.
Hmmm ..... VolatileRead
e VolatileWrite
sia sostenere i nostri tipi a 64 bit !! La mia domanda, allora, è,
"Perché la parola chiave volatile non ammessi in
C#
sui tipiSystem.Double
eSystem.Int64
, ecc?"
Si prega di notare che Microsoft ha corretto la pagina e ** non ** dice 'In C#, utilizzando il modificatore volatile, su un campo garantisce che tutti gli accessi a quel campo utilizza VolatileRead o VolatileWrite.' –