2016-12-20 1 views
0

Voici une classe qui, lorsqu'il est compilé avec les règles d'analyse de code de minimum de Microsoft recommandé, provoque cet avertissement:avertissement sur CA2002 string []

CA2002: Microsoft.Reliability: 'TestClass.SomeProperty.get()' verrouille sur une référence de type 'chaîne []'. Remplacez ceci par un verrou contre un objet avec une identité forte.

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

Pourquoi un tableau de chaînes être considéré comme un type d'identité faible? Ce n'est pas comme si les tableaux étaient internés ou quelque chose, n'est-ce pas? Et même s'ils pouvaient l'être, je ne suis pas en train de m'enfermer sur un système statique; Il est construit de manière dynamique au moment de l'exécution, ce qui le rend unique.

Ceci est sur Visual Studio 2010, si cela fait une différence.

+0

@ M.kazemAkhgary [? Pourquoi est-lock (this) {...} mauvais] (http://stackoverflow.com/questions/251391/why-is- lockthis-bad) – stuartd

Répondre

1

Selon MSDN:

Un objet est dit d'avoir une identité faible quand il est accessible directement à travers les frontières du domaine d'application. Un thread qui essaie d'acquérir un verrou sur un objet qui a une identité faible peut être bloqué par un deuxième thread dans un domaine d'application différent qui a un verrou sur le même objet.

Les types suivants ont une identité faible et sont marqués par la règle:

  • ...

  • Chaîne

Le problème est donc pas là la tableau, mais le type de chaîne utilisé. Je choisirais toujours d'utiliser un object comme type de verrou. Vous pouvez le faire en créant une nouvelle object:

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

Mais le fait est que je ne me verrouille pas sur une chaîne, je me verrouille sur un tableau. –

+0

Apparemment, CA ne veut utiliser aucun type de chaîne. –