【问题标题】:Why the ternary operator is not working this way?为什么三元运算符不以这种方式工作?
【发布时间】:2013-04-11 02:21:17
【问题描述】:

为什么不编译?下面的代码有什么问题?

(_DbContext == null) ? return _DbContext = new ProductAndCategoryEntities() : return _DbContext;

如果我重述它是否编译:

 if (_DbContext == null)
                   return _DbContext = new ProductAndCategoryEntities();
               else return _DbContext;

【问题讨论】:

  • _DbContext= (_DbContext == null) ? new ProductAndCategoryEntities() : _DbContext; 这有效吗?
  • @legendinmaking - 你完全正确,这是一个很好的解决方案
  • 顺便说一句,它是“条件”运算符;就操作数的数量而言,它恰好是 三元...

标签: c# .net logic ternary-operator


【解决方案1】:

条件表达式中: 两侧的内容是表达式,而不是语句。他们必须评估一些价值。 return (anything) 是一个语句而不是一个表达式(例如,你不能说 x = return _DbContext;),所以它在那里不起作用。

new ProductAndCategoryEntities()_DbContext 似乎都是表达式。所以你可以把return移到条件表达式的外面。

return (_DbContext == null) ? (_DbContext = new ProductAndCategoryEntities()) : _DbContext;

虽然,在这种情况下,最好丢掉?:,直接使用if

if (_DbContext == null) _DbContext = new ProductAndCategoryEntities();
return _DbContext;

这更简单一些。返回赋值的值通常看起来有点粗略。

【讨论】:

  • '他们必须有价值观。' -> 他们必须评估价值?否则很好的答案
  • @Patashu:听起来确实好一些。已编辑。 :)
【解决方案2】:

@muratgu 的回答是正确的。

但是,如果您将变量与 null 进行比较,那么这样写会更简洁:

return _DbContext ?? new ProductAndCategoryEntities();

在我看来,这完全一样,并且更紧凑和可读。

【讨论】:

  • 不,它不会做完全相同的事情,因为它不会将新实例分配给变量。
  • 这指的是muratgu的答案,其中三元运算的结果是从某种方法返回的。在这种情况下,结果是相同的。
  • 好吧,只需稍加修改,我就发现它的巨大回报 _DbContext ?? (_DbContext = new ProductAndCategoryEntities());
  • @AndreiZubov:是的,它和 muratgu 的代码做同样的事情,也有同样的问题。
  • 如果 _DbContext 是一个字段而不是内部方法变量,您可以进行赋值。但是为什么要从方法中返回值并将这个值同时分配给一个字段呢?在我看来,这是一个糟糕的设计决定。你的方法应该只更新你对象的状态或返回一些值(见Command-Query separation
【解决方案3】:

三元运算符的工作原理如下:

return (_DbContext == null) ? new ProductAndCategoryEntities() : _DbContext;

编辑: 在您的情况下,您需要分配 _DbContext,因此您需要第二条语句来执行此操作:

_DbContext = _DbContext ?? new ProductAndCategoryEntities();
return _DbContext;

(感谢@Andrei Zubov 提醒我?? 操作员)

【讨论】:

  • 是的,你是对的......但同时需要 _DbContext = new ProductAndCategoryEntities()
  • 你不是说return (_DbContext == null) ? _DbContext = new ProductAndCategoryEntities() : _DbContext;吗?
  • @Arun 你不能同时做作业。如果您需要(我相信您确实需要),您将需要两个语句,而不是一个。
  • @muratgu:你可以在表达式中做赋值,不需要两个语句。这不是漂亮的代码,但它确实有效。
【解决方案4】:

正如 ByteBlast 所建议的,您可以这样做:

 if (_DbContext == null)
                return (_DbContext = new ProductAndCategoryEntities());
            else return _DbContext;

或者,您可以考虑使用“??”操作员。例如:

return _DbContext ?? new ProductAndCategoryEntities();

【讨论】:

  • 它不会将新对象分配给_DbContext
【解决方案5】:

我发现这段代码很棒,但实际上并没有回答我的问题,但我从中学到了一些新东西......任何批评者都会非常感激。

 return _DbContext ?? (_DbContext = new ProductAndCategoryEntities());

【讨论】:

  • 为什么不在方法体之外做赋值呢?类似的东西:'_DbContext = GetDbContext();'在您的情况下,您的方法返回一个 _DbContext 值并同时更改对象的状态,这可能不是一件好事。
  • 它是单例模型......它返回类的单个实例......??运算符检查变量是否为空。如果它不为空,那么它只是返回实例,否则它将调用右侧表达式,创建新实例并将其分配给变量,然后返回该变量。
猜你喜欢
  • 2013-05-28
  • 2021-03-26
  • 2015-10-07
  • 1970-01-01
  • 2013-09-17
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
相关资源
最近更新 更多