2011-11-10 39 views
3

我想重構這段代碼。也許如果可能通過使用開關?或者在性能方面是否一樣?我可以在這裏使用C#開關嗎?

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

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

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

etc.. 
+0

Nnnnnnope .......我會使用一個elseif,可能更好的性能.. –

+0

我不認爲你可以執行包含開關,而不是你必須解析頁面名稱的原始URL或如果可能的話,你必須將你的情況設置爲完整的URL – CBRRacer

+0

你可以使用'else if'嗎?這將有助於表現 – tbridge

回答

3

交換機例必須是一個恆定值。你最好的選擇存在使用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語句將導致10,如果條件被處理無關緊要的東西,而可能會導致10 if/else語句,也可能只造成1

編輯:一些有關此

思想,我注意到你正在使用上下文對象。如果你真的想要一個switch語句,你可以這樣做:

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

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

不適用於包含。

嘗試孤立頁面名稱,你可以做到這一點。

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

    case "mypage2.aspx"; 
     break; 
} 
4

不是直接的,因爲你想要一個「包含」的關係,而不是一個確切的相等。然而,如果你願意,你可以通過試圖解析頁面名稱來解析頁面名稱,將其存儲在單獨的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; 
} 

而且,當然,請採取與一粒鹽這個解析方法;這個例子是爲了告訴你這是可能的,但是請注意,這種解析方法可能會在很多情況下拋出異常,但爲了簡潔起見我省略了這些檢查。

0

我認爲最好使用Dictionary

首先,從原始URL中提取文件名。然後,使用Dictionary<string,TValue>

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

如果操作非常不同,請將TValue設置爲代表類型,例如Action

相關問題