Я пытаюсь выяснить, является ли 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;
}
Что кажется проблематичнымme это следующая строка:
result = default(TEnum); /// (*)
Что если другой поток обращается к результату сразу после того, как ему присвоено значение по умолчанию, и до того, как ему присвоено проанализированное значение?
[EDIT]Ответ Зойдберга, я бы хотел немного перефразировать вопрос.
Вопрос, я полагаю, если Enum.TryParse является "транзакционным" (или атомарным).
Скажите, что у меня естьстатическое поле и передайте его в Enum.TryParse:
public static SomeEnum MyField;
....
Enum.TryParse("Value", out MyField);
Теперь, когда выполняется TryParse, другой поток обращается к MyField.TryParse на какое-то время изменит значение MyField на значение по умолчанию SomeEnum, и только затем установит для него проанализированное значение.
Это не обязательно ошибка в моем коде.Я бы ожидал, что Enum.TryParse либо установит MyField на проанализированное значение, либо вообще не прикасается к нему, а не использует его в качестве временного поля.