比较if-else、switch-case和Contains()的性能、可读性和可重用性

本文关键字:可读性 性能 switch-case if-else Contains 比较 | 更新日期: 2023-09-27 18:02:37

我有下面的代码(这是一个示例,还有更多的其他条件,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(),将会有更少的代码行数。

我也担心性能问题。

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

比较if-else、switch-case和Contains()的性能、可读性和可重用性

重要的第一步,不要每次都做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的情况下。

编辑:"看起来你在写一个状态机"。

请参阅nextState变量的使用,使其更明显。

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