设计模式外传——NULL OBJECT模式
NULL OBJECT看着这个名字应该有一个笼统的印象了。翻译成中文就是“空对象”。
假如我们要使用一个刚刚获得的对象的方法,首先需要检查一下该对象是否等于null,因为等于null的话调用方法会报未实例化异常,可是这样的写法很丑,如下所示:
MM mm = Money.GetMM();
mm.Smile(); //注意如果GetMM方法未找到MM就会返回一个null,那么mm.Smile();就会报异常了。
为了解决这个问题我们一般是这样处理:
MM mm = Money.GetMM();
if(mm!=null)
{
mm.Smile();
}
这样就可以高枕无忧了,偶也~~~~~~~
但是这样的东东是不是很丑哦。
如果你使用了NULL OBJECT模式就没这么多烦恼了,以下是MM的NULL OBJECT实现:
那在FrameWork中有这样的设计模式吗?答案是肯定的,比如:String.Empty,Decimal.Zero等。
用String.Empty写个例子吧。假如没有NULL OBJECT模式,也就是说没有String.Empty,我们会写下以下代码:
假如我们要使用一个刚刚获得的对象的方法,首先需要检查一下该对象是否等于null,因为等于null的话调用方法会报未实例化异常,可是这样的写法很丑,如下所示:
MM mm = Money.GetMM();
mm.Smile(); //注意如果GetMM方法未找到MM就会返回一个null,那么mm.Smile();就会报异常了。
为了解决这个问题我们一般是这样处理:
MM mm = Money.GetMM();
if(mm!=null)
{
mm.Smile();
}
这样就可以高枕无忧了,偶也~~~~~~~
但是这样的东东是不是很丑哦。
如果你使用了NULL OBJECT模式就没这么多烦恼了,以下是MM的NULL OBJECT实现:
public class MM
{
public static readonly MM Empty = new NULLMM();
public virtual void Smile()
{
Console.WriteLine("我笑~~~~~");
}
private class NULLMM : MM
{
public override void Smile()
{
//什么都不做
}
}
}
此时我们的Money.GetMM();方法如果得到了空值不返回null而是返回MM.Empty。由于MM.Empty已经是MM对象但是重写了Smile方法(什么都不做,体现了空对象的“素质”),这样的话mm.Smile();方法不用判断mm是否为空都可以执行了。{
public static readonly MM Empty = new NULLMM();
public virtual void Smile()
{
Console.WriteLine("我笑~~~~~");
}
private class NULLMM : MM
{
public override void Smile()
{
//什么都不做
}
}
}
那在FrameWork中有这样的设计模式吗?答案是肯定的,比如:String.Empty,Decimal.Zero等。
用String.Empty写个例子吧。假如没有NULL OBJECT模式,也就是说没有String.Empty,我们会写下以下代码:
public static string MyToUpper(string input)
{
string strTmp = null;
if (input.Length > 4)
{
strTmp = input.Substring(4);
}
return strTmp.ToUpper();
}
此时输入长度大于4的字符串是没有问题的,但是小于4的话由于strTmp未被赋值,也就是说strTmp是null,此时就会报“未将对象引用设置到对象的实例”异常。我们一般会改写为:{
string strTmp = null;
if (input.Length > 4)
{
strTmp = input.Substring(4);
}
return strTmp.ToUpper();
}
public static string MyToUpper(string input)
{
string strTmp = null;
if (input.Length > 4)
{
strTmp = input.Substring(4);
}
if (strTmp == null)
{
return "";
}
else
{
return strTmp.ToUpper();
}
}
以上判断了字符串是否为null,假如你知道有String.Empty这个NULL OBJECT模式的东东,你一定会写下下面这段优雅的代码的:{
string strTmp = null;
if (input.Length > 4)
{
strTmp = input.Substring(4);
}
if (strTmp == null)
{
return "";
}
else
{
return strTmp.ToUpper();
}
}
public static string MyToUpper(string input)
{
string strTmp = String.Empty;
if (input.Length > 4)
{
strTmp = input.Substring(4);
}
return strTmp.ToUpper();
}
此处的String.Empty相当于“”。如果你自己的类需要使用NULL OBJECT方法的话,就需要参考上边的MM类了。NULL OBJECT模式使得代码更加优雅些,具体还有什么特殊的用处我还未研究,以后看吧~~~~{
string strTmp = String.Empty;
if (input.Length > 4)
{
strTmp = input.Substring(4);
}
return strTmp.ToUpper();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器