30

OK、あなたが考えていることはわかります。「なぜ人々に使われたくないメソッドを書くのですか? 右?

要するに、XML にシリアル化する必要があるクラスがあります。がその魔法を実行するXmlSerializerには、クラスにデフォルトの空のコンストラクターが必要です。

public class MyClass
{
  public MyClass()
  {
    // required for xml serialization
  }
}

それで、私はそれを持っている必要がありますが、私は人々にそれを使用させたくないので、メソッドを「使用しない」とマークするために使用できる属性はありますか?

Obsolete属性を使用することを考えていました(これによりビルドが停止する可能性があるため) が、それはちょっと「間違っている」ように思えます。これを行う他の方法はありますか? :)

アップデート

OK、Keith の回答を受け入れました。私の心の中では完全に同意すると思います。これが、私が最初に質問した理由です。Obsolete属性を持つという概念は好きではありません。

でも...

まだ問題があります。インテリセンスで通知されている間、理想的にはビルドを中断したいので、これを行う方法はありますか? おそらくカスタム属性を作成しますか?

より焦点を絞った質問がここに作成されました。

4

13 に答える 13

27

以下を使用できます。

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]

IntelliSense に表示されないようにします。消費者がまだそれを使用したい場合は使用できますが、発見されにくくなります。

とはいえ、オーバーエンジニアリングについてのキースの指摘は依然として有効です。

于 2008-08-26T22:10:52.493 に答える
16

クラスがそうである場合[Serialisable](つまり、必要に応じてその場所にコピーできる場合)、パラメタのないコンストラクターを逆シリアル化する必要があります。

コードのアクセスを強制して、プロパティのデフォルトをパラメーター化されたコンストラクターに渡したいと思っていると思います。

基本的にXmlSerializer、コピーを作成してからプロパティを設定することは問題ないと言っていますが、独自のコードを作成する必要はありません。

ある意味、これは過剰設計だと思います。

どのプロパティを初期化する必要があるか (および何をすべきか) を詳述する XML コメントを追加するだけです。

ではないので、使用しないでください[Obsolete]。本当に非推奨のメソッド用に予約してください。

于 2008-08-26T11:58:55.040 に答える
7
throw new ISaidDoNotUseException();
于 2008-08-26T22:23:47.190 に答える
3

ObsoleteAttributeMSDN のドキュメントに次のように記載されているため、 の使用を推奨しているすべての人に反対する傾向があります。

要素を古いものとしてマークすると、その要素が製品の将来のバージョンで削除されることがユーザーに通知されます。

XML シリアライゼーションのジェネリック コンストラクターはアプリケーションから削除すべきではないため、将来の保守開発者が XML シリアライゼーションのしくみに精通していない場合に備えて、私はそれを適用しません。

私は実際にKeith のメソッドを使用して、コンストラクターが XML ドキュメントのシリアル化に使用され、Intellisense で表示されることに注目しました。

于 2008-08-26T12:34:50.240 に答える
2

見出しを読んですぐに「時代遅れの属性」と思いました。どうですか

    /// <summary>
    /// do not use
    /// </summary>
    /// <param name="item">don't pass it anything -- you shouldn't use it.</param>
    /// <returns>nothing - you shouldn't use it</returns>
    public bool Include(T item) { 
    ....
于 2008-08-26T11:12:47.317 に答える
2

メソッドを修飾するなど、独自のAttribute派生クラスをNonCallableAttribute構築し、ビルド/CI コード分析タスクに、コードがそれらのメソッドを使用しているかどうかを監視するチェックを追加できます。

私の意見では、開発者にこの方法を使用しないように強制することはできませんが、誰かがルールに違反したことをできるだけ早く検出して修正することはできます。

于 2008-08-26T22:18:32.867 に答える
1

シリアル化可能なオブジェクトをドメインオブジェクトから分離します。

于 2008-08-26T23:45:25.013 に答える
0

うわー、その問題も私を悩ませています。

NHibernate のデフォルト コンストラクターも必要ですが、クラスがコンストラクター コードを通過するように、C# 3.0 オブジェクト初期化子を使用しないように強制したいと思います。

于 2008-08-26T11:41:54.253 に答える
0

ObsoleteAttributeおそらくあなたの状況ではうまくいくでしょう-その方法が使用されている場合、ビルドが壊れる可能性さえあります.

古い警告はコンパイル時に発生し、シリアライゼーションに必要なリフレクションは実行時に発生するため、そのメソッドを古いものとしてマークしてもシリアライゼーションは中断されませんが、メソッドが使用されないことを開発者に警告します。

于 2008-08-26T11:13:06.240 に答える
0

あなたが探しているのはObsoleteAttributeクラスです:

using System;

public sealed class App {
   static void Main() {      
      // The line below causes the compiler to issue a warning:
      // 'App.SomeDeprecatedMethod()' is obsolete: 'Do not call this method.'
      SomeDeprecatedMethod();
   }

   // The method below is marked with the ObsoleteAttribute. 
   // Any code that attempts to call this method will get a warning.
   [Obsolete("Do not call this method.")]
   private static void SomeDeprecatedMethod() { }
}
于 2008-08-26T11:13:41.793 に答える
0

はい、あります。

私はそれについてこのブログ投稿を書きました デザイナーと一緒に働く.

コードは次のとおりです。


public class MyClass
{
  [Obsolete("reason", true)]
  public MyClass()
  {
    // required for xml serialization
  }
}

于 2008-08-26T11:13:53.773 に答える
0

を使用していObsoleteAttributeます。

もちろん、コメントを残すこともできます。

最後に、可能であれば完全に削除します (古いものとの互換性を維持する必要はありません)。それが最善の方法です。

于 2008-08-26T11:13:56.630 に答える