使用 EmptyClass 避免条件判断

简介: 在习惯了使用基于接口的编程之后,经常会遇到这样的问题,比如,B组件需要使用实现了IA接口的A组件,但是如果在没有A组件的情况下B组件也可以正常工作,像这样:     public interface IA    {        void DoWork1() ;        void ...

    在习惯了使用基于接口的编程之后,经常会遇到这样的问题,比如,B组件需要使用实现了IA接口的A组件,但是如果在没有A组件的情况下B组件也可以正常工作,像这样:

    public   interface  IA
    {
        
void  DoWork1() ;
        
void  DoWork2() ;
    }

    
public   class  B :IB
    {
        
private  IA theA ;

        
public  B(IA a)
        {
            
this .theA  =  a ;
        }

        
public   void  DoJob()
        {
            
//
             if ( this .theA  !=   null )
            {
                
this .theA.DoWork1() ;
            }
        }

        
public   void  DoOtherJob()
        {
            
//
             if ( this .theA  !=   null )
            {
                
this .theA.DoWork2() ;
            }
        }
    }


    可以看到很多地方都要用到if(this.theA != null)进行条件判断,如果某个地方露掉了这样的判断,运行时可能就会抛出“引用为空”的异常。有没有办法来彻底避免类似的条件判断了?有,那就是EmptyClass的目的。EmptyClass实现了比如上述的IA接口,但是EmptyClass什么都不做,即EmptyClass完全由VS.NET的智能感知自动生成(声明EmptyClass时,在写完接口名后按TAB键)。
    我们看看自动生成的IA对应的EmptyClass:

    public   class  EmptyA :IA
    {
        
#region  IA 成员

        
public   void  DoWork1()
        {
            
//  TODO:  添加 EmptyA.DoWork1 实现
        }

        
public   void  DoWork2()
        {
            
//  TODO:  添加 EmptyA.DoWork2 实现
        }

        
#endregion
    }


    现在就可以在B中来避免前面的条件判断了:

    public   class  B :IB
    {
        
private  IA theA ;

        
public  B(IA a)
        {
            
this .theA  =  a ;

             // 如果引用为空,则赋值什么都不做的EmptyClass
            
if ( this .theA  ==   null )  
            {
                
this .theA  =   new  EmptyA() ;
            }
        }

        
public   void  DoJob()
        {
            
//
             this .theA.DoWork1() ; // 不在需要条件判断!!!!!!!!
        }

        
public   void  DoOtherJob()
        {
            
//
             this .theA.DoWork1() ;
        }
    }


    这个简单的小技巧,你一定已经学会了:)
    在当一个组件对另一个组件的引用可以为空的时候,EmptyClass的实例就可以作为这个引用的默认值,这样不仅没有牺牲性能(空方法调用与条件判断的开销差不多),而且使得我们的代码更漂亮、更容易阅读和维护。

目录
相关文章
|
6月前
|
C# 开发者
C#条件语句
C#条件语句
58 0
|
2月前
|
Python
条件判断
条件判断。
33 3
|
2月前
|
C#
C# 一分钟浅谈:条件语句 if-else 的使用
【9月更文挑战第1天】条件语句是编程中的基础概念,C# 中的 `if-else` 语句允许根据不同条件执行不同代码块。本文详细介绍了 `if-else` 语句的基本语法和使用方法,并提供了多个示例,如根据年龄判断是否可以观看电影、根据成绩评定学生等级等。此外,还探讨了常见问题及其解决方法,例如条件表达式错误、忽略边界条件和条件分支过多等问题,并介绍了如何使用括号明确优先级、避免冗余条件、使用 `switch` 语句和提取公共逻辑等技巧。通过本文的学习,你可以更好地理解和运用 C# 中的条件语句。
86 0
|
5月前
|
安全 C++
C++一分钟之-控制流:if语句与条件判断
【6月更文挑战第18天】在C++中,`if`语句是控制流的核心,用于条件判断和决策。简单`if`检查条件是否为真,执行相应代码;`if-else`添加了否定分支;而`if-else if-else`链处理多个条件。常见问题包括真假值混淆(非零为真)、逻辑运算符误用、缺少可读性以及边界条件忽视。通过明确比较、理解逻辑运算符和强化边界检查,可以提高代码质量。示例展示了根据成绩输出不同反馈,强调了逻辑的清晰性和可维护性。掌握`if`语句是编写有效逻辑的关键。
63 13
|
6月前
|
机器学习/深度学习 算法 搜索推荐
条件语句在Pyth
条件语句在Pyth
30 1
|
6月前
|
C++
在C++条件语句
在C++条件语句
|
6月前
|
程序员 C++
C++条件语句
C++条件语句
56 0
|
6月前
|
C#
C# 循环与条件语句详解
使用 switch 语句选择要执行的多个代码块中的一个。 示例:
78 2
|
6月前
|
Shell 开发工具
利用if…then条件判断式
【1月更文挑战第7天】利用if…then条件判断式。
192 0
C#中的循环和条件语句
C#中的循环和条件语句
80 0