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

标签 c# properties

<分区>

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

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 公开凭据的只读版本来防止尝试写入用户名,同时在幕后使用读写版本。

关于c# - 我如何知道对象属性是否具有默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18043888/

相关文章:

c# - Lost references in Visual Studio 2017 解决方案

swift - 计算属性内的 NSNumberFormatter

spring - 如何保证Spring bean的顺序?属性占位符问题

.net - 如何在 C# 3.0 中自定义自动属性

c# - 在 WPF 中用数千行快速绘制 map

c# - 确定 XML 文件是 FlatOPC for Word

c# - 查询 C# 命名空间和使用

C# Dictionary<T,K> 单写多读线程安全

用于包装外部库的 Python 属性工厂或描述符类

c# - 何时调用属性?