这是一个类,当使用Microsoft的最低建议代码分析规则进行编译时,会引发此警告:
CA2002:Microsoft.Reliability:' TestClass.SomeProperty.get()'锁 在类型为' string []'的引用上。用一把锁替换它 具有强烈认同感的对象。
public sealed class TestClass
{
public TestClass(string[] first, string[] second)
{
combinedStrings = Combined(first, second);
}
public string SomeProperty
{
get
{
lock (combinedStrings)
return "A string";
}
}
private readonly string[] combinedStrings;
private static string[] Combined(string[] first, string[] second)
{
var combined = new string[first.Length + second.Length];
first.CopyTo(combined, 0);
second.CopyTo(combined, first.Length);
return combined;
}
}
为什么字符串数组会被视为弱身份类型?它不像数组得到实习或其他什么,是吗?即使它们可能,我也不会锁定静态定义的那个;它在运行时动态构建,因此保证是唯一的。
这是在Visual Studio 2010上,如果它有所作为。
答案 0 :(得分:1)
根据MSDN:
当一个对象可以跨应用程序域边界直接访问时,它被认为具有弱标识。尝试获取具有弱标识的对象的锁的线程可以被另一个具有锁定在同一对象的应用程序域中的第二个线程阻止。
以下类型具有弱标识,并由规则标记:
...
字符串
所以这里的问题不是数组,而是使用的字符串类型。我总是选择使用object
作为锁定类型。您可以通过创建新的object
:
private object lockObject = new object();
public string SomeProperty
{
get
{
lock (lockObject)
return "A string";
}
}