c# - 下面的 C# 代码(链接条件三元运算符)的含义是什么

标签 c#

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 的重复赋值,因为它允许投影必须具有相同类型的结果,从而允许单个任务。它还可以阻止 ifswitch 语句中可能出现的编码副作用行为。

编辑,其他替代方案

如果排列数量变得非常大,我会选择 Dictionary 查找模式将 ManageMes​​sageId 值映射到要在 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."},
      // ...
  };

等效的映射代码将很简单(只需使用一次条件运算符) - ManageMes​​sageId 是一个枚举:

public async Task<ActionResult> Index(ManageMessageId? message)
{
   ViewBag.StatusMessage = (message.HasValue)
      ? _messageDictionary[message.Value]
      : "";

关于c# - 下面的 C# 代码(链接条件三元运算符)的含义是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29427708/

相关文章:

c# - FPS 极低,我应该使用什么分析应用程序来查找性能问题?

c# - 在二进制流上实现 ReadLine() 的最有效方法是什么?

c# - 如何检查计时器触发下一个事件之前还剩多少时间?

c# - 类在运行时的属性和名称

javascript - C# 比 EO.WebBrowser 更快地获取 javascript DOM

c# - 在 Silverlight 应用程序中存储 ADO.NET 数据服务 URL 的最佳位置是什么?

c# - 相当于PHP在C#中的include

c# - caliburn.micro 导体不工作

c# - 基本线程池问题

c# - 在 C# 中以编程方式进入连接待机