为什么有时候要选择IsNotXXX方法而不是IsXXX方法呢?答案是效率。请看以下代码:
public abstract class DataSource {
public void ShowChart() {
if (IsNotJson()) {
Convert2Json();
}
}
}
以上代码可在我的 C#设计模式 系列博文中行为型模式下的模板方法模式中找到。
我们的需求是根据数据源的格式进行判断,如果数据源不是Json格式,那么我们需要转换成Json格式,如果数据源本身就是Json格式,那么我们什么也不要做,于是我们有了上面代码中的一个片段,如下所示:
if (IsNotJson()) {
Convert2Json();
}
可以看到我们选择了IsNotJson方法而不是IsJson方法,原因是什么呢?我们先来看看如果我们选择IsJson方法,代码会是什么样子。
if (IsJson()) {
}
else{
Convert2Json();
}
或者
if (!IsJson()) {
Convert2Json();
}
在第1个代码片段中,运行时在运行至IsJson方法时,如果是Json那么什么也不做,如果不是,则要跳转至else语句,无缘无故增加了JIT的负担。第2个代码片段也是一样,每次都要进行一次非(!)运算,这在一个大型的、高并发的Web应用程序中是绝对不允许的。因为它在没有带来任何好处的情况下却给系统带来了额外的计算负担。