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

时间:2016-02-22 17:12:52

标签: c# arrays thread-safety enumeration

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

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

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

bool valid = validValues.Contains( selection );

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

如果枚举不是线程安全的,那么使用Array.IndexOf之类的方法是否可以线程安全?反编译表明该方法调用本机方法TrySZIndexOf,或者通过索引迭代数组。从我读过的here开始,这可能是安全的吗?我只是宁愿使用Contains,因为它传达了比IndexOf() == -1更清楚地完成的事情。

2 个答案:

答案 0 :(得分:2)

是的,这种访问是线程安全的(假设数组永远不会被修改)。

如果标准DictionaryHashSet效果更好,也可以使用标准ImmutableListWhy are immutable objects thread-safe?,因为它们对于只读多线程访问也是安全的。

如果您担心错误地更改数组 - 请考虑使用新的不可变类型,例如immutable data structures

涵盖共鸣的通用讨论 - Read-only and theradsafe。此外,Eric Lippert撰写了一系列关于enter image description here的文章,并https://github.com/fpt-software/Material-Controls-For-iOS/触及了此类访问的主题。

答案 1 :(得分:0)

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

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

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