Я пытаюсь выяснить, является ли Enum.TryParse в .NET 4.0 потокобезопасным.
Исходный код (декомпилированный) :
[SecuritySafeCritical]
public static bool TryParse<TEnum>(string value, bool ignoreCase, out TEnum result) where TEnum : struct
{
result = default(TEnum); /// (*)
Enum.EnumResult enumResult = default(Enum.EnumResult);
enumResult.Init(false);
bool result2;
if (result2 = Enum.TryParseEnum(typeof(TEnum), value, ignoreCase, ref enumResult))
{
result = (TEnum)enumResult.parsedEnum;
}
return result2;
}
Что мне кажется проблематичным, так это строка:
result = default(TEnum); /// (*)
Что, если другой поток получит доступ к результату сразу после того, как ему будет присвоено значение по умолчанию, и до того, как ему будет присвоено проанализированное значение?
[РЕДАКТИРОВАТЬ] После ответа Зойдберга я хотел бы немного перефразировать вопрос.
Вопрос, я думаю, в том, является ли Enum.TryParse "транзакционным" (или атомарным).
Скажем, у меня есть статическое поле, и я передаю его в Enum.TryParse:
public static SomeEnum MyField;
....
Enum.TryParse("Value", out MyField);
Теперь, когда выполняется TryParse, другой поток обращается к MyField. TryParse изменит значение MyField на значение SomeEnum по умолчанию на некоторое время, и только затем установит его на проанализированное значение.
Это не обязательно ошибка в моем коде. Я бы ожидал, что Enum.TryParse либо установит MyField в проанализированное значение, либо вообще не коснется его, не будет использовать его в качестве своего временного поля.