Volatile - подсказка для компилятора (и компилятора ngen / jit), что значение этой переменной может измениться в любой момент, и, таким образом, будет отключена оптимизация доступа к переменной путем кэширования значения локально volatile.
Рассмотрим следующий код:
If (UserName == "")
// do something
If (UserName == "Fred")
// do something
Если volatile отсутствует, компилятор может сгенерировать IL, где он сохраняет ссылку в стеке для первого сравнения, а затем повторно использует ее для второго сравнения. Однако добавление volatile сообщает компилятору, что ссылка может быть изменена другим потоком, что вынуждает его генерировать IL, который не будет повторно использовать стековую копию из первого сравнения.