问题
我想要一个能够处理自身空引用的类。我怎样才能做到这一点?扩展方法是我能想到的唯一方法,但我想我会问,以防万一有一些我不知道的关于 C# 的好东西。
示例
我有一个名为 User
的类,它有一个名为 IsAuthorized
的属性。
当 User
被正确实例化时 IsAuthorized
有一个实现。但是,当我的 User
引用包含 null 时,我想调用 IsAuthorized
以返回 false 而不是爆炸。
解决方案
很多很好的答案。我最终使用了其中三个来解决我的问题。
- 我使用了 Zaid Masud 建议的空对象设计模式。
- 我将其与 Belmiris 关于使用结构的建议相结合,因此我不能使用空引用
- 并且从 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/