条件三进制与方法调用db

本文关键字:方法 调用 db 条件 | 更新日期: 2023-09-27 17:51:07

所以我在这里潜伏了几年,终于到了我没有找到一个现有的答案的情况。这个问题本身很简单。


假设以下语句(没有特定于语言的语法):

var result = fetchFromDb() == null ? defaultValue : fetchFromDb().property;

我想知道的是:Java或c#中的编译器是否有办法优化该语句,或者是否真的有两个调用fetchFromDb()方法意味着两个DB访问调用,两个执行计划等等?

我已经在Java中测试过了,发现这个方法被调用了两次,但我不知道最终在后台缓存或类似的东西。

那么:使用三元条件与方法是一个不好的做法吗?是否有一种方法来缓存与内联比较的值,以保持这种风格的美感?

条件三进制与方法调用db

是的,它将永远是两个调用。事实上,在第一次调用和第二次调用之间,fetchFromDb()的结果可能会发生变化。编译器没有办法预测值的变化,除非它是一个众所周知的确定性function。决定性是这里的关键词。即使这样,也可能没有针对这些事情的编译器优化。

在方法中使用三元条件本身并不是不好的做法,但它的可读性不如简单的if语句。

保证单个调用的唯一方法是编写单个调用。

var result;
var fetchResult = fetchFromDb();
if (fetchResult == null) {
    result = defaultValue;
} else {
    result = result.property;
}

或者如果你坚持使用三元格式

var fetchResult = fetchFromDb()
var result = (fetchResult == null) ? defaultValue : result.property;

我真的认为这比三元制清楚得多。单行代码并不意味着代码很漂亮。

实际上

var result = fetchFromDb() == null ? defaultValue : fetchFromDb().property;

将在else情况下进行两次调用。为了避免重复调用:

var fetch = fetchFromDb();
var result = fetch != null ? fetch.property : defaultValue;