在 C# 中枚举共享数组以进行只读访问是否安全?

本文关键字:读访问 是否 安全 枚举 共享 数组 | 更新日期: 2023-09-27 18:35:39

我有一个有效的字符串值数组,如下所示:

string[] validValues = new string[] {"none","all","some"};

我有一个方法可以在下拉框中验证用户的选择,如下所示:

bool valid = validValues.Contains( selection );

我不想每次调用此方法时都重新创建 validValues 数组,因此我想将其分配给 static readonly 属性。 数组本身是不可变的。此方案是否线程安全? 这是 MVC 控制器方法的一部分,因此很可能多个线程同时通过 Enumerable<string>.Contains 方法访问数组。

如果枚举不是线程安全的,那么改用像Array.IndexOf这样的方法是否线程安全? 反编译表明该方法要么调用本机方法 TrySZIndexOf,要么按索引遍历数组。从我在这里读到的内容来看,这可能是安全的吗? 我宁愿使用包含,因为它比IndexOf() == -1更清楚地传达了试图完成的内容。

在 C# 中枚举共享数组以进行只读访问是否安全?

是的,此访问是线程安全的(假设数组从未被修改)。

您还可以使用标准DictionaryHashSet如果效果更好,因为两者都对于只读多线程访问也是安全的。

如果您担心可能会错误地更改数组 - 请考虑使用新的不可变类型,如 ImmutableList。


涵盖解决方案的一般讨论 - 为什么不可变对象是线程安全的?。此外,Eric Lippert还有一系列关于不可变数据结构的文章,以及关于这种访问主题的只读和theradsafe。

是的。当您将其声明为只读时,它是线程安全的。

您可以在 C# 中使用 ReadOnlyCollection 类,而不是将数组声明为只读。

https://msdn.microsoft.com/en-us/library/ms132474(v=vs.110).aspx