2013-08-14 1 views
9

위양성으로 보이는 코드 분석 경고가 나타납니다.False CA1812 경고 : "명백하게 인스턴스화되지 않은 내부 클래스 ..."

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.

어떻게이 경고 제거합니까? 나는 내가 그것을 다르게 피할 수 없다고 확신하지 않는 한 경고를 억제하지 않는 것을 선호한다.

클래스는 다음과 같다 :

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

내가 이런 식으로 그것을 사용 :

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

이 사용이 인스턴스로 계산하지 않는다?

+5

'GetMyPrivateClasses()'자체가 명확하게 호출 되었습니까? (자신이 호출되지 않는 다른 개인 메소드에서만 간접적으로 호출되는 경우 계산하지 않음) –

+0

@MatthewWatson 예. 내 코드가 모두 제대로 작동하고 있으며이 특정 메서드는 내 보고서의 핵심 부분이므로 그렇습니다. –

+0

이 메소드가 (예를 들어'ToList'를 사용하여) 실행하지 않고 질의를 반환하기 때문에 클래스가 인스턴스화되는지 여부는 명확하지 않습니다. –

답변

15

나는 그것이 일리노이를 조사하고 있다고 생각한다. 진정으로 IL은 new MyPrivateClass 명령을 포함하지 않습니다.이 명령문은 아마도 IQueryable<T>에 대해 실행 중이므로 람다는 표현 트리입니다. 일부 Expression.New 및 일부 typeof(MyPrivateClass) - 포함하지만 new MyPrivateClass은 포함하지 않습니다.

이 경우 오류는 오해의 소지가 있습니다. 단순히 그것을 억제하십시오.

+2

경고 설명에서도 명시 적으로 다음과 같이 말합니다. http://msdn.microsoft.com/en-us/library/ms182265.aspx – BartoszKP

0

클래스를 내부 또는 공개로 변경하면 문제가 해결됩니다. 어쨌든 외부 클래스에서 내부 클래스를 추출 할 수 있습니다 ...

관련 문제