Enum.TryParse - это потокобезопасно?

Я пытаюсь выяснить, является ли 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 в проанализированное значение, либо вообще не коснется его, не будет использовать его в качестве своего временного поля.

5
задан abieganski 2 March 2012 в 13:20
поделиться