zoukankan      html  css  js  c++  java
  • Null Object模式

    我们经常为了避免异常的发生,都会进行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的判定操作。

  • 相关阅读:
    hdu 3415 Max Sum of MaxKsubsequence
    poj 2243 Knight Moves
    【LCD手册】飞凌3.5/4.3/5.6/7/8 寸LCD手册大全下载
    【转载zq2002好文章】Windows CE 休眠唤醒全面解析(基于2440平台)(1)(2)(3)
    【转载】如果做到窗口自动适应不同尺寸屏幕的尺寸?
    【转载】wince6.0+s3c6410摄像头驱动修改
    推荐一个比较活跃的ARM/WinCE/LinuxQQ群
    【转载】微软的USB摄像头驱动,
    【收集】ARM+WinCE QQ 群
    【转载】S3C6410移植日记系列
  • 原文地址:https://www.cnblogs.com/lxGIS/p/3339850.html
Copyright © 2011-2022 走看看