2013-08-14 5 views
9

Ich erhalte eine Codeanalyse-Warnung, die falsch-positiv zu sein scheint.Falsche CA1812-Warnung: "interne Klasse, die scheinbar nie instanziiert wurde ..."

CA1812 : Microsoft.Performance : 'MyClass.MyPrivateClass' is an internal class that is apparently never instantiated. If so, remove the code from the assembly. If this class is intended to contain only static methods, consider adding a private constructor to prevent the compiler from generating a default constructor.

Wie kann ich diese Warnung wieder los? Ich bevorzuge es, Warnungen nicht zu unterdrücken, es sei denn, ich bin mir sicher, dass ich es sonst nicht vermeiden könnte.

Die Klassen wie folgt aussehen:

namespace Some.Namespace 
{ 
    public class MyClass 
    { 
     private class MyPrivateClass 
     { 
      public int Id { get; set; } 
      public ModelObject { get; set; } 
     } 
    } 
} 

ich es wie folgt verwendet werden:

private IQueryable<MyPrivateClass> GetMyPrivateClasses() 
{ 
    return this.Repository().All() 
     .Select(m => new MyPrivateClass { Id = m.Id, ModelObject = m }; 
} 

Enthält diese Nutzung nicht als Instanziierung zählen?

+5

Wird 'GetMyPrivateClasses()' definitiv aufgerufen? (Zählt nicht, wenn es nur indirekt von einer anderen privaten Methode aufgerufen wird, die nie selbst aufgerufen wurde) –

+0

@MatthewWatson Ja, definitiv. Mein Code funktioniert ordnungsgemäß, und diese spezielle Methode ist ein zentraler Teil meines Berichts, also ja. –

+0

Auch wenn es aufgerufen wird, ist es nicht klar, ob die Klasse instanziiert wird, da diese Methode eine Abfrage zurückgibt, ohne sie auszuführen (z. B. durch Verwendung von "ToList"). –

Antwort

15

Ich denke, es untersucht die IL; und wirklich - dass IL niemals eine new MyPrivateClass-Anweisung enthält - weil diese Anweisung vermutlich gegen IQueryable<T> läuft, daher ist Lambda ein Ausdrucksbaum. Es enthält einige Expression.New und einige typeof(MyPrivateClass) - aber keine new MyPrivateClass.

In diesem Fall ist der Fehler irreführend. Einfach unterdrücken.

+2

Es ist sogar in der Warnung Beschreibung explizit gesagt: http://msdn.microsoft.com/en-us/library/ms182265.aspx – BartoszKP

0

Ändern Sie Ihre Klasse zu internen oder öffentlichen, die das Problem löst. Wie auch immer, du kannst deine innere Klasse aus der äußeren Klasse extrahieren ...