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