2016-12-20 1 views
0

Hier ist eine Klasse, die, wenn sie mit Microsoft empfohlenen Mindestcodeanalyseregeln zusammengestellt, verursacht diese Warnung:CA2002 Warnung auf string []

CA2002: Microsoft.Reliability: 'TestClass.SomeProperty.get()' sperrt für eine Referenz vom Typ 'string []'. Ersetzen Sie dies durch eine Sperre gegen ein Objekt mit starker Identität.

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; 
    } 
} 

Warum würde ein String-Array ein schwacher Identität Typ in Betracht gezogen? Es ist nicht so, dass Arrays interniert werden oder so, oder? Und selbst wenn sie sein könnten, schließe ich mich nicht an eine statisch definierte an; Es ist zur Laufzeit dynamisch aufgebaut, also garantiert einzigartig.

Dies ist auf Visual Studio 2010, wenn es einen Unterschied macht.

+0

@ M.kazemAkhgary [? Warum Schlösser (diese) sind {...} schlecht] (http://stackoverflow.com/questions/251391/why-is-: Sie können eine neue object tun, dass durch die Schaffung lockthis-bad) – stuartd

Antwort

1

Nach MSDN:

Ein Objekt wird gesagt, eine schwache Identität haben, wenn es über Anwendungsdomänengrenzen direkt zugegriffen werden kann. Ein Thread, der versucht, eine Sperre für ein Objekt mit einer schwachen Identität zu erhalten, kann durch einen zweiten Thread in einer anderen Anwendungsdomäne blockiert werden, die eine Sperre für dasselbe Objekt besitzt.

Die folgenden Typen haben eine schwache Identität und werden von der Regel gekennzeichnet:

  • ...

  • String

Also hier das Problem ist nicht die Array, aber der verwendete String-Typ. Ich würde immer wählen, eine object als Lock-Typ zu verwenden.

private object lockObject = new object(); 
public string SomeProperty 
{ 
    get 
    { 
     lock (lockObject) 
      return "A string"; 
    } 
} 
+0

Aber der Punkt ist, ich bin nicht auf eine Zeichenfolge sperren, ich bin auf ein Array sperren. –

+0

Anscheinend möchte CA keinen Typ mit String verwenden. –

Verwandte Themen