我使用下面的伪代码来澄清我的问题(使用的类是无关紧要的):
var client = new SmtpClient();
client.Credentials = ...;
现在,如果我想使用此代码。我怎么知道如何使用它。我可以尝试像这样设置属性值:
client.Credentials.User = "MyUsername";
应该给我一个NullReferenceException,因为没有分配默认的凭据对象。或者我可以像这样使用它:
client.Credentials = new Credentials("MyUsername",...);
但初始化属性的正确方法是自己设置DefaultNetworkCredentials:
client.Credentials = CredentialCache.DefaultNetworkCredentials;
如何在设计时知道对象属性是否具有默认值而不查看文档(如果存在)?
对象属性的最佳实践/设计指南是什么?是否应该始终存在属性的默认值?
答案 0 :(得分:2)
你不知道没有文档,因为属性只是可以按照作者想要的方式实现的方法。该属性可以绘制一个随机数,并根据该决定。
因此,您需要来自该类作者的声明,他是否保证该属性永远不会为空。
我发现使用Reflector查看类通常比导航MSDN更快。 MSDN有时也不记录这些内容。
对于UI组件,属性网格通常会显示默认值。如果您设置了不同的值,它将变为粗体。此信息取自DefaultValue
。但是,无法保证该属性是准确的。
答案 1 :(得分: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公开只读版本的凭证来防止尝试写入用户名,同时使用封底的读写版本。
答案 2 :(得分:0)
最好的方法是检查文档,但是,您也可以通过反射查找DefaultValue
属性。