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."
: "";发布于 2015-04-03 07:15:06
(列出的代码来自ASP.Net MVC 5应用程序中的支架式ASP.Net)
这是条件算子的一种链式使用。
虽然嵌套的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 (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]
: "";https://stackoverflow.com/questions/29427708
复制相似问题