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

没有文档你不知道,因为属性只是可以按照作者想要的任何方式实现的方法。该属性可以绘制一个随机数并据此决定。

因此,您需要该类的作者声明他是否向您保证该属性永远不会为空。

我发现使用 Reflector 查看课程通常比浏览 MSDN 更快。此外,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,而不能处理Credentials对象的 API。可能未设置的事实Credentials隐藏在方法后面。您甚至可以通过 API 公开只读版本的凭据来防止尝试写入用户名,同时在幕后使用读写版本。

于 2013-08-04T14:26:20.867 回答
0

最好的方法是查看文档,但是,您也可以DefaultValue通过反射查找属性。

于 2013-08-04T14:19:11.170 回答