我们经常为了避免异常的发生,都会进行null判定。列如对于任意对象执行ToString()操作,都应该进行null检查。如下面的代码是经常可以在很多人的程序里看到的:
object obj = new object(); string objName = string.Empty; if (obj != null) { objName = obj.ToString(); } Console.WriteLine(objName);
当然还有更简洁的写法:
object obj1 = "liuxu"; string objname = (obj1 ?? string.Empty).ToString(); Console.WriteLine(objname); Console.Read();
??运算符,又称为null-coalescing operator,如果左操作符为null,则返回右操作数的值,如果不为null则返回左操作数的值。
下面引入正题,什么是null object模式?
简单来说,null object模式就是为对象提供一个指定的类型,来代替对象为空的情况。看看下面我写的这段代码,一个NullUser类和User类实现了IUser接口,接口里定义了需要实现的属性ISNull,定义为只读类型,也就是get;
public class User : IUser { public void Login() { Console.WriteLine("User Login now"); } public void GetInfo() { Console.WriteLine("User Logout now."); } public bool IsNull { get { return false; } } } public class NullUser : IUser { public void Login() { //TODO: } public void GetInfo() { } public bool IsNull { get { return true; } } }
同时通过UserManager类来完成对User的操作和管理,通过关联方式,将IUser作为UserManager的属性来实现,基于对null object的引入,实现的方式为:
class UserManage { private IUser user = new User(); internal IUser User { get { return user; } set { user = value ?? new NullUser(); } } }
测试一下:
static void Main(string[] args) { UserManage manager = new UserManage(); manager.User = null; manager.User.Login(); if (manager.User.IsNull) { Console.WriteLine("用户不存在,请检查!"); } }
将null value转换为null object,把对user==null这样的判断,转换为user.IsNull。通过强制将User属性实现为null,在调用Login时仍然能够保证系统的稳定性,有效避免对null的判定操作。