首页 文章

我如何知道对象属性是否具有默认值? [关闭]

提问于
浏览
4

我使用下面的伪代码来澄清我的问题(使用的类是无关紧要的):

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

现在,如果我想使用此代码 . 我怎么知道如何使用它 . 我可以尝试像这样设置属性值:

client.Credentials.User = "MyUsername";

这应该给我一个NullReferenceException,因为没有分配默认凭证对象 . 或者我可以像这样使用它:

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

但是初始化属性的正确方法是自己设置DefaultNetworkCredentials:

client.Credentials = CredentialCache.DefaultNetworkCredentials;

如何在设计时知道对象属性是否具有默认值而不查看文档(如果存在)?

对象属性的最佳实践/设计指南是什么?是否应该始终存在属性的默认值?

3 回答

  • 2

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

    因此,您需要来自该类作者的声明,他是否保证该属性永远不为null .

    我发现使用Reflector查看类通常比导航MSDN更快 . MSDN有时也不记录这些内容 .

    对于UI组件,属性网格通常会显示默认值 . 如果您设置了不同的值,它将变为粗体 . 此信息取自 DefaultValue . 但是,无法保证该属性是准确的 .

  • 2

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

  • 0

    一般来说,设计一个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公开只读版本的凭证来防止尝试写入用户名,同时在封面下使用读写版本 .

相关问题