c# - 有没有办法让 C# 类处理它自己的空引用异常

标签 c#

问题

我想要一个能够处理自身空引用的类。我怎样才能做到这一点?扩展方法是我能想到的唯一方法,但我想我会问,以防万一有一些我不知道的关于 C# 的好东西。

示例

我有一个名为 User 的类,它有一个名为 IsAuthorized 的属性。

User 被正确实例化时 IsAuthorized 有一个实现。但是,当我的 User 引用包含 null 时,我想调用 IsAuthorized 以返回 false 而不是爆炸。


解决方案

很多很好的答案。我最终使用了其中三个来解决我的问题。

  1. 我使用了 Zaid Masud 建议的空对象设计模式。
  2. 我将其与 Belmiris 关于使用结构的建议相结合,因此我不能使用空引用
  3. 并且从 Jon Hanna 那里得到了关于为什么 C# 以这种方式工作以及我如何才能真正解决它的很好的解释

不幸的是,我只能选择其中一个作为我接受的答案,所以如果您正在访问此页面,您应该花时间对所有这三个以及给出的任何其他优秀答案进行投票。

最佳答案

一个合适的面向对象的解决方案怎么样?这正是 Null Object 的内容设计模式是为了。

您可以提取一个 IUser 接口(interface),让您的 User 对象实现这个接口(interface),然后创建一个 NullUser 对象(它也实现 IUser)并始终在 IsAuthorized 属性上返回 false。

现在,修改消费代码以依赖于 IUser 而不是 User。客户端代码将不再需要空检查。

下面的代码示例:

public interface IUser
{
    // ... other required User method/property signatures

    bool IsAuthorized { get; }
}

public class User : IUser
{
    // other method/property implementations

    public bool IsAuthorized
    {
        get { // implementation logic here }
    }
}

public class NullUser : IUser
{
    public bool IsAuthorized
    {
        get { return false; }
    }
}

现在,您的代码将返回 IUser 而不是 User,客户端代码将仅依赖于 IUser:

public IUser GetUser()
{
    if (condition)
    {
        return new NullUser(); // never return null anymore, replace with NullUser instead
    }
    return new User(...);
}

关于c# - 有没有办法让 C# 类处理它自己的空引用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11972281/

相关文章:

c# - WPF复选框双向绑定(bind)不起作用

c# - Entity Framework 试图在数据库中将空字符串保存为 null

c# - "Always running"控制台应用程序

c# - Visual Studio 右括号的放置

c# - 在打开的 xml 中查找特定表(在书签之后)

c# - 如何知道 nuget mahapps 地铁图标包中的可用图标名称?

c# - Linq to SQL DynamicInvoke(System.Object[])' 没有支持的 SQL 转换

c# - 我需要把.xlsx下载

c# - 设置字符串的最大长度c#但以整个单词结尾

c# - 如何在没有 PIN 提示的情况下通过智能卡读卡器访问 PKI 证书的私钥?