127

ObsoleteAtribute を .Net で使用すると、コンパイラの警告が表示され、オブジェクト/メソッド/プロパティが廃止され、他のものを使用する必要があることが通知されます。私は現在、元従業員のコードの多くのリファクタリングを必要とするプロジェクトに取り組んでいます。私が作成したメッセージを与えるコンパイラ警告を生成するメソッドまたはプロパティをマークするために使用できるカスタム属性を作成したいと考えています。このようなもの

[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 でコンパイラの警告を生成する方法です。

4

10 に答える 10

101

これは試してみる価値があります。

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
{

}
于 2008-09-30T18:09:30.640 に答える
51

一部のコンパイラでは、#warning を使用して警告を発行できます。

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

Microsoft コンパイラでは、通常、次のメッセージ プラグマを使用できます。

#pragma message ( "text" )

あなたは .Net について言及しましたが、C/C++ と C# のどちらでプログラミングしているかは特定しませんでした。C# でプログラミングしている場合は、C# が #warning format をサポートしていることを知っておく必要があります。

于 2008-09-30T17:33:50.460 に答える
42

私たちは現在、すべてをすぐに修正することができなかった多くのリファクタリングの真っ最中です。戻ってコードを確認する必要がある場合は、#warning preproc コマンドを使用するだけです。コンパイラ出力に表示されます。メソッドに置くことはできないと思いますが、メソッドのすぐ内側に置くことはできますが、それでも簡単に見つけることができます。

public void DoEverything() {
   #warning "This code sucks"
}
于 2008-09-30T19:39:32.093 に答える
30

アップデート

これは、Roslyn (Visual Studio 2015) で可能になりました。カスタム属性をチェックするコード アナライザーを構築できます。


私はそれが可能だとは思わない。ObsoleteAttribute は、コンパイラによって特別に扱われ、C# 標準で定義されています。ObsoleteAttribute が受け入れられないのはなぜですか? これはまさにそれが設計された状況であり、あなたが必要とするものを正確に達成しているように私には思えます!

また、Visual Studio は ObsoleteAttribute によって生成された警告もオンザフライで取得することに注意してください。これは非常に便利です。

なぜあなたがそれを使いたくないのか疑問に思っているだけで、役に立たないという意味ではありません...

残念ながら、ObsoleteAttribute は封印されているため (おそらく特別な処理が原因の 1 つです)、そこから独自の属性をサブクラス化することはできません。

C# 標準から:-

Obsolete 属性は、もはや使用されるべきではない型および型のメンバーをマークするために使用されます。

Obsolete 属性で装飾された型またはメンバーをプログラムが使用する場合、コンパイラは警告またはエラーを発行します。具体的には、エラー パラメータが指定されていない場合、またはエラー パラメータが指定されていて値が false の場合、コンパイラは警告を発行します。error パラメータが指定され、値が true の場合、コンパイラはエラーを発行します。

それはあなたのニーズを要約していませんか?... あなたはそれ以上のことをするつもりはないと思います.

于 2008-09-30T18:20:07.587 に答える
8

VS 2008 (+sp1) では、#warnings は、Clean Soultion & Rebuild Solution の後、エラー リストに正しく表示されません。特定のクラス ファイルを開いた後にのみ、一部の警告がエラー リストに表示されます。そのため、カスタム属性を使用することを余儀なくされました:

[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'。

警告のテキストを変更できません。'Some comment' が表示されません エラー リスト。ただし、ファイル内の適切な場所にジャンプします。したがって、このような警告メッセージを変更する必要がある場合は、さまざまな属性を作成してください。

于 2010-01-10T22:02:36.813 に答える
7

あなたがやろうとしていることは、属性の誤用です。代わりに、Visual Studio タスク リストを使用してください。次のように、コードにコメントを入力できます。

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

次に、メニューから View / Task List を開きます。タスク リストには、ユーザー タスクとコメントの 2 つのカテゴリがあります。コメントに切り替えると、すべての //Todo: がそこに表示されます。TODO をダブルクリックすると、コード内のコメントにジャンプします。

アル

于 2014-09-28T21:37:20.770 に答える
2

ObsoleteAttributeのソースを見ると、コンパイラの警告を生成するために特別なことをしているようには見えません。ObsoleteAttributeを使用して警告メッセージを生成したくない理由はありますか?

于 2008-09-30T18:11:35.470 に答える
2

私はあなたができるとは思わない。私が知る限り、ObsoleteAttribute のサポートは基本的に C# コンパイラにハードコードされています。同様のことを直接行うことはできません。

できることは、コンパイルされたばかりのアセンブリに対してカスタム ツールを実行する MSBuild タスク (またはビルド後のイベント) を使用することです。カスタム ツールは、アセンブリ内のすべての型/メソッドを反映し、カスタム属性を消費します。その時点で、System.Console のデフォルトまたはエラー TextWriters に出力できます。

于 2008-09-30T17:59:10.930 に答える
1

警告またはプラグマを挿入することを提案するコメントがいくつかあります。時代遅れの作品は非常に異なる方法で動作します! ライブラリ L の関数を古いものとしてマークすると、呼び出し元プログラムがライブラリ L にない場合でも、プログラムが関数を呼び出すと古いメッセージが発生します。警告は、L がコンパイルされている場合にのみメッセージを発生させます。

于 2014-11-12T17:00:28.830 に答える