我使用下面的伪代码来澄清我的问题(使用的类是无关紧要的):
var client = new SmtpClient();
client.Credentials = ...;
现在,如果我想使用此代码 . 我怎么知道如何使用它 . 我可以尝试像这样设置属性值:
client.Credentials.User = "MyUsername";
这应该给我一个NullReferenceException,因为没有分配默认凭证对象 . 或者我可以像这样使用它:
client.Credentials = new Credentials("MyUsername",...);
但是初始化属性的正确方法是自己设置DefaultNetworkCredentials:
client.Credentials = CredentialCache.DefaultNetworkCredentials;
如何在设计时知道对象属性是否具有默认值而不查看文档(如果存在)?
对象属性的最佳实践/设计指南是什么?是否应该始终存在属性的默认值?
3 回答
你不知道没有文档,因为属性只是可以按照作者想要的方式实现的方法 . 该属性可以绘制一个随机数,并根据该决定 .
因此,您需要来自该类作者的声明,他是否保证该属性永远不为null .
我发现使用Reflector查看类通常比导航MSDN更快 . MSDN有时也不记录这些内容 .
对于UI组件,属性网格通常会显示默认值 . 如果您设置了不同的值,它将变为粗体 . 此信息取自
DefaultValue
. 但是,无法保证该属性是准确的 .最好的方法是检查文档,但是,您也可以通过反射查找
DefaultValue
属性 .一般来说,设计一个API是一个坏主意,其中调用者必须经常“跳过一个级别” . 您的示例要求API的用户了解凭据的内部结构 - 具体而言,凭据具有用户名 . 这表明紧密耦合 - 您的API设计应该努力避免的事情 .
解决这个问题的方法是公开跳过API用户的间接级别的方法,例如:
现在,您的API用户只能处理您的API,而不能处理
Credentials
对象的API . 可能未设置Credentials
的事实隐藏在方法后面 . 您甚至可以通过API公开只读版本的凭证来防止尝试写入用户名,同时在封面下使用读写版本 .