【问题标题】:Comparing if-else, switch-case and Contains() for performance, readibility and reusebility比较 if-else、switch-case 和 Contains() 的性能、可读性和可重用性
【发布时间】:2011-07-15 09:32:29
【问题描述】:

我有以下代码(这是一个示例,还有更多其他条件与Session["Yapilanislem_Popup"].ToString() 不同。)。

       if (Session["Yapilanislem_Popup"].ToString() == "updatemustericeki")
        {
            KayitGuncelleme();
        }

        else if (Session["Yapilanislem_Popup"].ToString() == "updatemusterisenedi")
        {
            KayitGuncelleme();
        }           

            ///

        else if (Session["Yapilanislem_Popup"].ToString() == "yenitahsilat")
        {
            YeniKayit();
            Session["Yapilanislem_Popup"] = "updatetahsilat";
            BaslikLabel.Text = "Tahsilat Güncelle";
        }
        else if (Session["Yapilanislem_Popup"].ToString() == "yeniodeme")
        {
            YeniKayit();
            Session["Yapilanislem_Popup"] = "updateodeme";
            BaslikLabel.Text = "Ödeme Güncelle";
        }

我想使用switch-caseContains()switch-caseContains() 重构此代码。

对于Contains(),我想我可以这样做:

if (Session["Yapilanislem_Popup"].ToString().Contains("update"))
            {
                KayitGuncelleme();
            }
else if(Session["Yapilanislem_Popup"].ToString().Contains("yeni")){
YeniKayit();
                Session["Yapilanislem_Popup"] = "updateodeme";
                BaslikLabel.Text = "Ödeme Güncelle";

}

对于switch-case,我基本上可以分情况写。

Switch-case 对于Session["Yapilanislem_Popup"].ToString() 的更多条件将是多行代码,但是如果我使用Contains(),代码行数将会减少。

我也担心性能问题。

在性能、可读性和可重用性方面,哪个更好用?

【问题讨论】:

  • 也许你可以提到编程语言,否则评论性能可能会很困难:-)
  • @Frank 对不起施密特先生,这是 C# 我标记了它,我认为它很明显。
  • 最佳性能(以及可读性)将创建包含 Session["Yapilanislem_Popup"].ToString() 的变量,而不是多次调用它

标签: c# performance if-statement switch-statement


【解决方案1】:

海量第一步,别每次都做Session["Yapilanislem_Popup"].ToString(),搞定一次:

string yapPopup = Session["Yapilanislem_Popup"].ToString();

然后使用case语句:

string nextState = yapPopup; // default to no state change

switch (yapPopup)
{
case "yenitahsilat":
    YeniKayit();
    nextState = "updatetahsilat";
    BaslikLabel.Text = "Tahsilat Güncelle";
    break;

case "yeniodeme":
    YeniKayit();
    nextState = "updateodeme";
    BaslikLabel.Text = "Ödeme Güncelle";
    break;

default:
    if (yapPopup.Contains("update"))
    {
        KayitGuncelleme();
    }
    break;
}

Session["Yapilanislem_Popup"] = nextState;

请注意,完全匹配有自己的case,任何其他逻辑/测试都发生在default 的情况下。

编辑:“看起来您正在编写状态机”(ala clippy)。请参阅nextState 变量的使用以使其更明显。

【讨论】:

  • 好的,谢谢,关于 switch-case 和 Contains() 的比较,有什么想法吗?
  • 什么意思? Containsdefault 的情况下?
  • 是的,谢谢,我一开始没有看到。谢谢,这看起来是一个很好的解决方案。
【解决方案2】:

我不禁注意到,使用Convert.ToString(session["value"]) 而不是Session["Value"].ToString() 总是更好,因为它也会处理您的空对象。

【讨论】:

  • 谢谢Mr.Menon,我想保证不会为空但我会用这个方法。
猜你喜欢
  • 1970-01-01
  • 2016-08-07
  • 2014-05-10
  • 1970-01-01
  • 2018-08-07
  • 2012-01-17
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
相关资源
最近更新 更多