簡體   English   中英

我可以在這里使用ac#開關嗎?

[英]can I use a c# switch here?

我想重構這段代碼。 也許如果可能的話,使用開關? 或者在性能方面是否相同?

string rawUrl = context.Request.RawUrl ?? string.Empty;

if (rawUrl.Contains("mypage.aspx"))
{
}

if (rawUrl.Contains("mypage2.aspx"))
{
}

etc..

不是直接的,因為你想要一個“包含”關系,而不是一個完全相等的關系。

但是,如果您願意,可以通過嘗試從我假設的URL解析頁面名稱,將其存儲在單獨的String變量中,並打開該String來間接地執行此操作。

例如:

// Get the URL from some external source (wherever you're already getting it from)
String rawUrl = "http://www.example.com/foo/bar.aspx";

// Means of parsing will be dependent on the format in which you expect the URL.
String page = rawUrl.Substring(rawUrl.LastIndexOf("/") + 1);

switch (page) {
    case "bar.aspx":
        // Do stuff
        break;
    case "foo.aspx":
        // Do stuff
        break;
}

當然,請將這種解析方法與一粒鹽一起使用; 這個例子是為了向你展示它是可能的,但請注意,這種解析方法可能會在很多情況下引發異常,但為了簡潔起見,我省略了這些檢查。

Switch Cases必須是一個常量值。 你最好選擇使用if / else之類的:

string rawUrl = context.Request.RawUrl ?? string.Empty;

if (rawUrl.Contains("mypage.aspx"))
{
    //code
}
else if (rawUrl.Contains("mypage2.aspx"))
{
    //more code
}

如果你擔心表現(這很好!)那么其他的就是你要走的路。 雖然不使用else將具有相同的功能,但通過添加else,您告訴代碼不處理任何其他條件。 因此10 if語句將導致10如果條件被處理不重要,而10 if / else語句可能導致10,或者它可能只導致1。

編輯:

想到這一點,我注意到你正在使用上下文對象。 如果您真的想要一個switch語句,可以執行以下操作:

string page = context.Request.Url.Segments.Last();

switch(page)
{
    case "mypage.aspx":
        //code
        break;
    case "mypage2.aspx":
        //more code
        break;
}

不適用於包含。

嘗試單獨隔離頁面名稱,您可以這樣做。

switch(pageName)
{
    case "mypage.aspx";
        break;

    case "mypage2.aspx";
        break;
}

我認為使用Dictionary會更好。

首先,從原始URL中提取文件名。

然后,使用Dictionary<string,TValue>

如果對頁面的操作幾乎相同,請將TValue設置為與頁面關聯的數據類型。

如果操作非常不同,請將TValue設置為委托類型,例如Action

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM