ViewBag.StatusMessage =
message == ManageMessageId.ChangePasswordSuccess ? "Your password has been changed."
: message == ManageMessageId.SetPasswordSuccess ? "Your password has been set."
: message == ManageMessageId.SetTwoFactorSuccess ? "Your two-factor authentication provider has been set."
: message == ManageMessageId.Error ? "An error has occurred."
: message == ManageMessageId.AddPhoneSuccess ? "Your phone number was added."
: message == ManageMessageId.RemovePhoneSuccess ? "Your phone number was removed."
: "";
最佳答案
(列出的代码来自 ASP.Net MVC 5 应用程序中的支架 ManageController
)
这是 conditional operator 的链式使用
尽管使用嵌套 if 语句可以实现相同的结果:
if (message == ManageMessageId.ChangePasswordSuccess)
ViewBag.StatusMessage = "Your password has been changed."
else if (message == ManageMessageId.SetPasswordSuccess)
ViewBag.StatusMessage = "Your password has been set."
...
或者 switch 语句
switch (message)
case ManageMessageId.ChangePasswordSuccess:
ViewBag.StatusMessage = "Your password has been changed.";
break;
case ManageMessageId.SetPasswordSuccess:
ViewBag.StatusMessage = "Your password has been set.";
break;
...
以链式方式使用条件运算符的好处是可以避免 ViewBag.StatusMessage
的重复赋值,因为它允许投影必须具有相同类型的结果,从而允许单个任务。它还可以阻止 if
或 switch
语句中可能出现的编码副作用行为。
编辑,其他替代方案
如果排列数量变得非常大,我会选择 Dictionary
查找模式将 ManageMessageId
值映射到要在 ManageController 的 Viewbag 中设置的字符串
,因为这会减少匹配适当键的比较次数:
private static readonly IDictionary<ManageMessageId, string> _messageDictionary
= new Dictionary<ManageMessageId, string>
{
{ManageMessageId.ChangePasswordSuccess, "Your password has been changed."},
{ManageMessageId.SetPasswordSuccess, "Your password has been set."},
// ...
};
等效的映射代码将很简单(只需使用一次条件运算符) - ManageMessageId
是一个枚举:
public async Task<ActionResult> Index(ManageMessageId? message)
{
ViewBag.StatusMessage = (message.HasValue)
? _messageDictionary[message.Value]
: "";
关于c# - 下面的 C# 代码(链接条件三元运算符)的含义是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29427708/