我试图弄清楚 .NET 4.0 的 Enum.TryParse 是否是线程安全的。
源代码(反编译)是:
[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); /// (*)
如果另一个线程在它被设置为默认值之后并且在它被设置为解析值之前访问了结果怎么办?
[编辑] 在 Zoidberg 的回答之后,我想重新表述一下这个问题。
我猜问题是,如果 Enum.TryParse 是“事务性的”(或原子的)。
假设我有一个静态字段,并将其传递给 Enum.TryParse:
public static SomeEnum MyField;
....
Enum.TryParse("Value", out MyField);
现在,当执行 TryParse 时,另一个线程访问 MyField。TryParse 会暂时将 MyField 的值更改为 SomeEnum 的默认值,然后才会将其设置为解析后的值。
这不一定是我的代码中的错误。我希望 Enum.TryParse 将 MyField 设置为解析值或根本不触摸它,不将其用作临时字段。