4

質問を明確にするために、次の疑似コードを使用します (使用されるクラスは重要ではありません)。

var client = new SmtpClient();
client.Credentials = ...;

今、このコードを使用したい場合。どうやってそれを使用する方法を知っていますか。次のようにプロパティ値を設定しようとすることができます。

client.Credentials.User = "MyUsername";

デフォルトの資格情報オブジェクトが割り当てられていないため、 NullReferenceException が発生するはずです。または、次のように使用できます。

client.Credentials = new Credentials("MyUsername",...);

しかし、プロパティを初期化する正しい方法は、次のように DefaultNetworkCredentials を自分で設定することです。

client.Credentials = CredentialCache.DefaultNetworkCredentials;

ドキュメント (存在する場合) を調べずに、設計時にオブジェクト プロパティに既定値があるかどうかを知るにはどうすればよいですか?

オブジェクト プロパティのベスト プラクティス/設計ガイドラインは何ですか? プロパティの既定値は常に存在する必要がありますか?

4

3 に答える 3

2

プロパティは作成者が望む方法で実装できる単なるメソッドであるため、ドキュメントがないとわかりません。プロパティは乱数を抽出し、それに基づいて決定できます。

そのため、クラスの作成者から、プロパティが決して null にならないことを保証するかどうかについての声明が必要です。

MSDN をナビゲートするよりも、Reflector を使用してクラスを調べた方が速いことがよくあります。また、MSDN ではこれらのことを文書化していないことがあります。

UI コンポーネントの場合、プロパティ グリッドにデフォルト値が表示されることがよくあります。別の値を設定すると、太字になります。この情報は から取得されますDefaultValue。ただし、属性が正確であるという保証はありません。

于 2013-08-04T14:19:55.977 に答える
2

一般に、呼び出し元が定期的に「レベルをスキップ」しなければならないような API を設計するのはお勧めできません。あなたの例では、API のユーザーが資格情報の内部構造について知る必要があります。具体的には、その資格情報にはユーザー名が含まれています。これは、密結合を示しています。これは、API 設計で回避するよう努める必要があります。

これを回避する方法は、たとえば次のように、API のユーザーに対してそのレベルの間接化をスキップするメソッドを公開することです。

void SetCredentialsUser(string user) {
    // Do the checks necessary to see if credentials are there;
    // create a new instance if necessary.
}

これで、API のユーザーは、オブジェクトの API ではなく、API のみを扱うことができCredentialsます。設定できない可能性があるという事実Credentialsは、メソッドの背後に隠されています。API を介して読み取り専用バージョンの資格情報を公開し、内部では読み取り/書き込みバージョンを使用することで、ユーザー名を書き込もうとする試みを防ぐこともできます。

于 2013-08-04T14:26:20.867 に答える
0

DefaultValue最良の方法はドキュメントを確認することですが、リフレクションを介して属性を探すこともできます。

于 2013-08-04T14:19:11.170 に答える