Null checks are quite common in the code I write. It litters up my class methods with all kinds of exception handling. The Null Object Design Pattern helps me to avoid this checking for null. It provides a non functional object to the client instead of null. So I can call a method on this object that effectively does nothing. This is what I learned.
Create a base class (or interface) with an embedded null object, returning default value on null from a static read only property. Create a few objects derived from that base class and implement the abstract properties and methods. From your Repository return the Null Object instead of null whenever needed. In the example the Null Object gets returned on a find to the ‘Restless’ Person.
using System;
namespace NullObject
{
class Program
{
static void Main(string[] args)
{
PersonRepository personRepository = new PersonRepository();
var oldPerson = personRepository.Find("Old");
var youngPerson = personRepository.Find("Young");
var restlessPerson = personRepository.Find("Restless");
oldPerson.Talk();
youngPerson.Talk();
restlessPerson.Talk();
oldPerson.ShutUp();
youngPerson.ShutUp();
restlessPerson.ShutUp();
Console.Read();
}
}
public abstract class PersonBase
{
public abstract string Name { get; }
public abstract int Age { get; }
public abstract void Talk();
public abstract void ShutUp();
#region Null implementation
// Singleton
static readonly NullPerson nullPerson = new NullPerson();
public static NullPerson Null
{
get { return nullPerson; }
}
// Embedded Null Object class
public class NullPerson : PersonBase
{
public override string Name { get { return string.Empty; } }
public override int Age { get { return 0; } }
public override void Talk() { }
public override void ShutUp() { }
}
#endregion
}
public class OldPerson : PersonBase
{
public override string Name
{
get { return "Grandpa"; }
}
public override int Age
{
get { return 80; }
}
public override void Talk()
{
Console.WriteLine(
"Bladibla uche uche bla... I'm {0} years old", this.Age);
}
public override void ShutUp()
{
Console.WriteLine("{0} stopped talking", this.Name);
}
}
public class YoungPerson : PersonBase
{
public override string Name
{
get { return "Little girl"; }
}
public override int Age
{
get { return 7; }
}
public override void Talk()
{
Console.WriteLine(
"Bladibla hihihihihi bla... I'm {0} years old", this.Age);
}
public override void ShutUp()
{
Console.WriteLine("{0} stopped talking", this.Name);
}
}
public class PersonRepository
{
public PersonBase Find(string name)
{
if (name.Contains("Old"))
{
return new OldPerson();
}
else if (name.Contains("Young"))
{
return new YoungPerson();
}
return PersonBase.Null;
}
}
}
As expected, the find to a ‘RestlessPerson’ gets a null object returned and does nothing.
分享到:
相关推荐
**C#对象为Null模式(Null Object Pattern)** 在软件开发中,经常遇到的一个问题是对象可能为null。这种情况下,如果我们尝试调用该null对象的方法或属性,就会引发`NullReferenceException`异常。为了解决这个问题...
《Think in C#》是一本深受程序员喜爱的C#编程语言教程,由知名软件开发者、教育家Miguel de Icaza和Gary McLean Hall等人共同编写。这本书深入浅出地介绍了C#语言的核心概念和技术,是.NET 2005框架下的经典学习...
object value = pi.GetValue(tc, null); string name = pi.Name; // 这里可以对value和name做进一步处理 } ``` #### 检查属性类型 在实际应用中,可能需要根据属性的类型来进行不同的处理。例如,如果属性...
If you have ever bought any programming books, you might have noticed that there are two types of them: books that are too short to ...Null Object Observer State Strategy Template Method Visitor
《Think in C#》是一本深受程序员喜爱的C#编程教程,由资深程序员 Bruce Eckel 编著。这本书深入浅出地介绍了C#语言的核心概念和技术,旨在帮助读者建立起对C#的深入理解和思考方式。"C# in Think"这个标签则强调了...
《C# 5.0 in a Nutshell, 5th Edition》是一本全面介绍C# 5.0编程语言的经典著作。这本书由权威专家编写,深入浅出地讲解了C# 5.0的关键特性,旨在帮助开发者快速掌握并熟练应用这一强大的编程工具。 C# 5.0是微软...
在C#编程中,非空验证(Not-Null Check)是一项关键的实践,它确保了程序在处理用户输入或者从数据库、文件等源获取数据时,不会因为引用了空值而导致运行时错误。非空验证通常发生在数据提交到业务逻辑层或者在数据...
Classes are the building blocks of object-oriented programming in C#. They define the blueprint for objects and encapsulate data and behavior. Classes can contain fields, properties, methods, and ...
10. **C#的新特性**:随着版本的更新,C#不断引入新的特性和改进,如异步流(Async Streams)、模式匹配(Pattern Matching)、空安全(Null Safety)等,保持了其作为现代编程语言的竞争力。 《Thinking in C#》这...
10个PB常见问题的讨论
《C# 3.0 in a Nutshell》是O'Reilly出版社出版的一本经典书籍,主要针对C#编程语言的第三个主要版本进行深入探讨。这本书是C#开发者的重要参考资料,涵盖了C# 3.0的新特性和核心概念,旨在帮助程序员理解和掌握这个...
CoreJava-DesignPattern 创意设计模式 -- Abstract Factory - Done -- Builder - Done -- Factory Method -- Object Pool -- Prototype - Done -- Singleton - Done 结构设计模式 -- Adapter -- Bridge -- ...
C#中 Json 序列化去掉 null 值的方法 在 C# 中, Json 序列化是一种常用的数据交换格式,但是在实际应用中,我们经常会遇到对象的某些属性为 null 的情况,这时候我们需要将这些 null 值去掉,下面我们就来讨论如何...
《C# 4.0 in a Nutshell》是由Joseph Albahari和Ben Albahari合著的一本关于C#编程语言的重要参考书籍,出版于2010年2月3日。这本书是针对C# 4.0版本的,该版本在C#的发展历程中是一个重要的里程碑,引入了许多新...
C# oracle 类 事务处理 #region 公有方法 public void JoinTransaction(Transaction transaction) { if (this._transaction != null) { throw new Exception("对象已经在另一个事务中"); } else { this._...
CHANGES: * V1.5 * + 修正indent[aaa,bbb] 的问题 ,后面没换行的问题,主要是美化。 ... * V1.4 * + 修正D7下关闭溢出出错的问题{.$.Q-} ... * + Null Object Design Patern (ex: for obj in values.N['path'] do ...)
### C# In Depth:从1.0到5.0语法演进详解 #### C#的演变与发展历程 C#作为一种面向对象的编程语言,自2000年首次发布以来,经历了多次重大更新和发展。从最初的C#1.0版本到后来的C#5.0,每一版都有显著的变化和...
使用SafeFinder,您可以通过简单的DSL定义模型的Null Object ,并在找不到该模型的实例时将其返回。 安装 将此行添加到您的应用程序的Gemfile : gem 'safe_finder' 然后执行: $ bundle 或将其自己安装为: $ ...
在C#编程中,禁用或启用本地网络连接是一项常见的系统管理任务,特别是在网络管理和自动化部署的场景下。本文将详细讲解如何通过C#代码来实现这一功能,并提供相关的源码解析。 首先,我们需要理解C#如何与操作系统...