带有方法调用db的条件三元组

时间:2015-05-29 07:31:11

标签: java c# performance conditional-operator method-call

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

假设以下语句(无语言特定语法):

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

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

我已经在Java中对此进行了测试,发现该方法被调用了两次,但我不知道在后台或类似的事情中最终的缓存。

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

2 个答案:

答案 0 :(得分:2)

是的,它总是两个电话。事实是在第一次通话和第二次通话之间,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;

我真的认为这比三元更清楚。将代码放在一行上并不能推断出漂亮的代码。

答案 1 :(得分:0)

实际上

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

将在else案例中进行两次调用。为了避免双重呼叫:

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