DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

今後使ってほしくないメソッドを使った時に警告やエラーを表示する

ライブラリをバージョンアップした時、今までのメソッドに問題があり、その代わりに別のメソッドを用意するといったケースがあります。新しいメソッドを使ってもらうように説明書に書いたとしてもほとんどの人は見ないでしょうし、かと言って古いメソッドをなくしてしまうと互換性を失います。

このような時には、ObsoleteAttribute属性が便利です。この属性をメソッドに適用すると、コンパイラが警告やエラーを出すようになります。また、警告(またはエラー)メッセージとして、代わりになる方法の説明を指定することができます。

以下の例ではOldMethodメソッドとVeryOldMethodメソッドを旧式としてマークし、VeryOldMethodメソッドを使ったらコンパイル時にエラーが発生するようにしています。

VB.NET
コードを隠すコードを選択
Public Class Program
    'このメソッドを旧式としてマークし、コンパイル時に警告を出す
    <Obsolete("代わりに 'NewMethod()' を使用します。")> _
    Public Shared Sub OldMethod()
        Console.WriteLine("OldMethod")
    End Sub

    'このメソッドを旧式としてマークし、コンパイル時にエラーを出す
    <Obsolete("'代わりに 'NewMethod()' を使用します。", True)> _
    Public Shared Sub VeryOldMethod()
        Console.WriteLine("VeryOldMethod")
    End Sub

    Public Shared Sub NewMethod()
        Console.WriteLine("NewMethod")
    End Sub

    'エントリポイント
    Public Shared Sub Main()
        OldMethod()
        VeryOldMethod()
    End Sub
End Class
C#
コードを隠すコードを選択
using System;

public class Program
{
    //このメソッドを旧式としてマークし、コンパイル時に警告を出す
    [Obsolete("代わりに 'NewMethod()' を使用します。")]
    public static void OldMethod()
    {
        Console.WriteLine("OldMethod");
    }

    //このメソッドを旧式としてマークし、コンパイル時にエラーを出す
    [Obsolete("'代わりに 'NewMethod()' を使用します。", true)]
    public static void VeryOldMethod()
    {
        Console.WriteLine("VeryOldMethod");
    }

    public static void NewMethod()
    {
        Console.WriteLine("NewMethod");
    }

    //エントリポイント
    public static void Main()
    {
        OldMethod();
        VeryOldMethod();
    }
}

この例ではMainメソッドで旧式のメソッドを使っていますが、Visual Studioのコードエディタでは「OldMethod()」の下に緑の波線が、「VeryOldMethod()」の下に赤い(または、青い)波線が引かれます。また、これらにマウスポインタを合わせるとツールチップが表示され、旧式であることと、Obsolete属性に指定したメッセージが表示されます。

ツールチップ

また、コンパイルしようとすると、以下のような警告とエラーが発生します。

エラー一覧

なお、2番目のパラメータにTrueを指定してエラーが出るようにした場合でも、コンパイル時にエラーとなるだけで、コンパイルされていれば、実行時には正常に実行されます。

Obsolete属性はメソッド以外にも、プロパティやクラスなど、ほとんどの要素(アセンブリ、モジュール、パラメーター、戻り値を除くすべてのプログラム要素)に適用することができます。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。