9

注:私はすでにmsdnをチェックしましたが、実際の質問には対応していません。以下を参照してください。

クラスの1つで(明らかに廃止された)コンストラクターで廃止された属性を使用しようとしています。シナリオは次のとおりです。

既存のデプロイ済みコードに影響を与えることなく、開発者に新しいコンストラクターへの更新を強制できるようにしたいと思います。このようにして、コードを本番環境に問題なくデプロイできますが、開発者の観点からは、コードに入るたびに、無視されると確信している「警告」を受け取るのではなく、現状はもはや問題ないため、コンパイルエラー。

だから私の質問は、これは開発者だけに影響するのか、それともすべての呼び出し側アプリに影響するのか、それとも全体が間違っているのかということです。

サンプルコード:

public class MyClass
{
   private string _userID; //new code

   [Obsolete("This constructor is obsolete, please use other constructor.", true)]
   public MyClass()
   {
      _userID = ""; //defaulting to empty string for all those using this constructor
   }

   public MyClass(string userID)
   {
      _userID = userID; //this is why they need to use this constructor
   }
}

よろしくお願いします。

4

4 に答える 4

11

はい、これは主にコンパイラに影響します-ビルド済みのコードは影響を受けません...そのコードがこの属性を明示的にチェックしない限り。たとえば、一部のシリアル化コード(XmlSerializer、IIRC)はこれをチェックします-したがって、完全に副作用がないわけではないかもしれません...しかし、原則として、既存のコードは、次にコンパイルしようとするまで通常影響を受けません。

もちろん、動的コンパイルを使用するもの(たとえば、プリコンパイルなしのASP.NET)からこのコードを使用している場合、すべての賭けは無効になります。

于 2012-05-30T17:37:22.927 に答える
3

属性はコンパイラへの単なる命令です。既存のバイナリは引き続きコンストラクタを使用できます。

于 2012-05-30T17:36:35.633 に答える
2

だから私の質問は、これは開発者だけに影響するのか、それともすべての呼び出し側アプリに影響するのか、それとも全体が間違っているのかということです。

これは、コンパイラによってコンパイル時にのみ使用されます。すでにデプロイされているアプリケーションには影響しません。

そのため、これはあなたが達成しようとしている振る舞いをします。

于 2012-05-30T17:36:42.600 に答える
2

これは[廃止]がすでに行っていることであり、追加のヘルプは必要ありません。これはコンパイル時の警告ではなく、エラーを生成します。

エラーCS0619:'ConsoleApplication1.MyClass.MyClass()'は廃止されました:'このコンストラクターは廃止されました。他のコンストラクターを使用してください。

于 2012-05-30T17:37:58.230 に答える