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

时间:2013-08-04 14:16:18

标签: c# properties

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

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

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

client.Credentials.User = "MyUsername";

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

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

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

client.Credentials = CredentialCache.DefaultNetworkCredentials;

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

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

3 个答案:

答案 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属性。