[c#] 사용자 정의 컴파일러 경고

.Net에서 ObsoleteAtribute를 사용하면 객체 / 메서드 / 프로퍼티가 쓸모없고 다른 것을 사용해야한다는 컴파일러 경고가 표시됩니다. 저는 현재 전 직원 코드를 리팩토링해야하는 프로젝트를 진행하고 있습니다. 작성하는 메시지를 제공하는 컴파일러 경고를 생성하는 메서드 또는 속성을 표시하는 데 사용할 수있는 사용자 지정 특성을 작성하고 싶습니다. 이 같은

[MyAttribute("This code sux and should be looked at")]
public void DoEverything()
{
}
<MyAttribute("This code sux and should be looked at")>
Public Sub DoEverything()
End Sub

“이 코드는 sux이며 살펴 봐야합니다.”라는 컴파일러 경고를 생성하기를 원합니다. 사용자 지정 특성을 만드는 방법을 알고 있습니다. 문제는 Visual Studio에서 컴파일러 경고를 생성하는 방법입니다.



답변

최신 정보

이제 Roslyn (Visual Studio 2015)으로 가능합니다. 당신은 할 수 있습니다 구축 코드 분석기를 사용자 지정 특성을 확인하기 위해


나는 그것이 가능하다고 믿지 않는다. ObsoleteAttribute는 컴파일러에서 특별히 처리되며 C # 표준에 정의되어 있습니다. 왜 ObsoleteAttribute가 허용되지 않습니까? 이것이 정확히 설계된 상황 인 것처럼 보이며 필요한 것을 정확하게 달성합니다!

또한 Visual Studio는 ObsoleteAttribute에 의해 생성 된 경고도 즉석에서 선택하므로 매우 유용합니다.

도움이되지 않는다는 뜻이 아니라, 왜 그것을 사용하고 싶지 않은지 궁금해합니다.

불행히도 ObsoleteAttribute는 봉인되어 있습니다 (아마 부분적으로 특수 처리로 인해). 따라서 여기에서 자신의 속성을 하위 클래스화할 수 없습니다.

C # 표준에서 :-

Obsolete 속성은 더 이상 사용하지 않아야하는 유형 및 유형의 멤버를 표시하는 데 사용됩니다.

프로그램이 Obsolete 특성으로 데코 레이팅 된 유형 또는 멤버를 사용하는 경우 컴파일러는 경고 또는 오류를 발행합니다. 특히, 오류 매개 변수가 제공되지 않거나 오류 매개 변수가 제공되고 값이 false 인 경우 컴파일러는 경고를 발행합니다. 오류 매개 변수가 지정되고 값이 true 인 경우 컴파일러는 오류를 발행합니다.

그것은 당신의 필요를 요약하지 않습니까? … 당신은 내가 생각하지 않는 것보다 더 잘하지 않을 것입니다.


답변

이것은 시도 할 가치가 있습니다.

최종적이므로 Obsolete를 확장 할 수 없지만 자신 만의 속성을 만들고 다음과 같이 해당 클래스를 구식으로 표시 할 수 있습니다.

[Obsolete("Should be refactored")]
public class MustRefactor: System.Attribute{}

그런 다음 “MustRefactor”속성으로 메소드를 표시하면 컴파일 경고가 표시됩니다. 컴파일 시간 경고를 생성하지만 오류 메시지가 재미있어 보이므로 직접 확인하고 선택해야합니다. 이것은 당신이 달성하고자하는 것에 매우 가깝습니다.

업데이트 : 이 코드를 사용하면 경고가 생성됩니다 (별로 좋지는 않지만 더 나은 것이 있다고 생각하지 않습니다).

public class User
{
    private String userName;

    [TooManyArgs] // Will show warning: Try removing some arguments
    public User(String userName)
    {
        this.userName = userName;
    }

    public String UserName
    {
        get { return userName; }
    }
    [MustRefactor] // will show warning: Refactor is needed Here
    public override string ToString()
    {
        return "User: " + userName;
    }
}
[Obsolete("Refactor is needed Here")]
public class MustRefactor : System.Attribute
{

}
[Obsolete("Try removing some arguments")]
public class TooManyArgs : System.Attribute
{

}


답변

일부 컴파일러에서는 #warning을 사용하여 경고를 발행 할 수 있습니다.

#warning "Do not use ABC, which is deprecated. Use XYZ instead."

Microsoft 컴파일러에서는 일반적으로 pragma 메시지를 사용할 수 있습니다.

#pragma message ( "text" )

.Net에 대해 언급했지만 C / C ++ 또는 C #으로 프로그래밍하는지 여부는 지정하지 않았습니다. C #으로 프로그래밍하는 경우 C #이 #warning 형식을 지원 한다는 사실을 알아야 합니다 .


답변

우리는 현재 모든 것을 즉시 고칠 수없는 많은 리팩토링 중입니다. 돌아가서 코드를 확인해야하는 곳에서 #warning preproc 명령을 사용합니다. 컴파일러 출력에 표시됩니다. 나는 당신이 그것을 메소드에 넣을 수 있다고 생각하지 않지만, 당신은 그것을 메소드 안에 넣을 수 있으며 여전히 찾기 쉽습니다.

public void DoEverything() {
   #warning "This code sucks"
}


답변

VS 2008 (+ sp1)에서 Clean Soultion & Rebuild Solution 후 #warnings가 오류 목록에 제대로 표시되지 않습니다. 특정 클래스 파일을 연 후에 만 ​​오류 목록에 일부 경고가 표시됩니다. 그래서 사용자 지정 속성을 사용해야했습니다.

[Obsolete("Mapping ToDo")]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property)]
public class MappingToDo : System.Attribute
{
    public string Comment = "";

    public MappingToDo(string comment)
    {
        Comment = comment;
    }

    public MappingToDo()
    {}
}

그래서 일부 코드에 플래그를 지정하면

[MappingToDo("Some comment")]
public class MembershipHour : Entity
{
    // .....
}

다음과 같은 경고를 생성합니다.

Namespace.MappingToDo는 더 이상 사용되지 않습니다 : ‘Mapping ToDo’.

경고 텍스트를 변경할 수 없습니다. ‘일부 댓글’에 오류 목록이 표시되지 않습니다. 그러나 파일의 적절한 위치로 이동합니다. 따라서 이러한 경고 메시지를 변경해야하는 경우 다양한 속성을 만듭니다.


답변

당신이하려는 것은 속성의 오용입니다. 대신 Visual Studio 작업 목록을 사용하십시오. 다음과 같이 코드에 주석을 입력 할 수 있습니다.

//TODO:  This code sux and should be looked at
public class SuckyClass(){
  //TODO:  Do something really sucky here!
}

그런 다음 메뉴에서보기 / 작업 목록을 엽니 다. 작업 목록에는 사용자 작업과 설명의 두 가지 범주가 있습니다. 댓글로 전환하면 // Todo :가 모두 표시됩니다. TODO를 두 번 클릭하면 코드의 주석으로 이동합니다.

Al


답변

나는 당신이 할 수 있다고 생각하지 않습니다. 내가 아는 한 ObsoleteAttribute에 대한 지원은 기본적으로 C # 컴파일러에 하드 코딩됩니다. 당신은 직접적으로 비슷한 것을 할 수 없습니다.

수행 할 수있는 작업은 방금 컴파일 된 어셈블리에 대해 사용자 지정 도구를 실행하는 MSBuild 작업 (또는 빌드 후 이벤트)을 사용하는 것입니다. 사용자 지정 도구는 어셈블리의 모든 형식 / 메서드를 반영하고 사용자 지정 특성을 사용하여 System.Console의 기본값 또는 오류 TextWriter에 인쇄 할 수 있습니다.