2010-10-13 58 views
1

在將字符串(通常)轉換爲適當的數據類型時,似乎還存在很多混淆,同時也會對它進行實時驗證。無論我在哪裏看 - 博客,文章,代碼示例,論壇......有幾個人似乎都有首選處理這些情況的方式。轉換來自未知來源的C#數據類型

的情況下通常是一個字符串/對象是來自未知來源,如查詢字符串,會議/視圖狀態,WebService的,等...

我見過很多不同的例子:

假設我們試圖獲取id=查詢字符串並將其作爲整數在我們的代碼中使用。但有人篡改了我們的網址,並將其改爲

http://www.example.com/page.aspx?id=sometextvalue

一種方式

int id = Convert.ToInt32(Request["id"]); 
// "Input string was not in a correct format" 

另一種方式

int id = (int)Request["id"]; 
// "Input string was not in a correct format" 

另一種方式

int id = int.Parse(Request["id"]); 
// "Input string was not in a correct format" 

我所見過這個(它那種有道理拋出一個異常,並通知用戶)

int id = 0; 
try { 
    id = Convert.ToInt32(Request["id"]); 
} 
catch(Exception ex) { 
    lblError.Text = ex.Message; 
} 
if(id > 0) { ... } 

最後,和一個我親自使用

int id = 0; 
int.TryParse(Request["id"], out id); 

// make sure it's not 0 
if(id > 0) { // live a happy life } 

這同樣適用於所有其他類型,booldoubledecimal等..

請幫助我理解正確的方法是什麼,因爲我發現自己使用這個在一天到一天的基礎上。

+0

正確的地方。這就是爲什麼人們對Ruby/Python如此興奮!專注於行爲和數據類型可以稍後處理 – Perpetualcoder 2010-10-13 02:29:53

回答

6

嗯,首先,你應該使用:

int id; 
if(!int.TryParse(Request["id"], out id) 
    //notify the user, or handle it someother way 

,而不是檢查ID> 0 int.TryParse(string, out int)返回true如果解析成功,否則false

MSDN Documentation for int.TryParse(string, out int)

+0

感謝@wawa,我不知道TryParse返回一個布爾值。 – Marko 2010-10-13 02:18:26

0

我不認爲任何這些實際上被認爲是「正確的」。我喜歡使用Convert.ToInt32(),因爲我可以得到一些特定的異常,我可以檢查它是否有效的輸入。

+0

'Convert.ToInt32'產生與'int.Parse'相同的異常。 – Gabe 2010-10-13 02:39:42

+0

而你應該依賴布爾返回的TryParse方法,因爲異常不應該驅動你的程序流。 – 2010-10-13 04:36:00

0

正確:答案是,這取決於。你應該學習類型化,解析的區別。適當地使用它們。

+0

嗯,我想我已經解釋了這個場景...... – Marko 2010-10-13 02:19:01

+0

但是,對於所有的場景都沒有一攬子答案。 – shaans 2010-10-13 02:23:15

4

System.ComponentModel命名空間包含了整整做這類轉換的一個精心設計的框架。

檢查命名空間爲自己,但是這將讓你去爲首發:

targetType newValue = (targetType) System.ComponentModel.TypeDescriptor.GetDescriptor(typeof(sourceType)) 
    .ConvertTo((object)value, typeof(targetType)) 

你得到的基本類型轉換爲免費在一個集中式不可知的地方,而不是通過遺憾的是不一致的搜索在基元類型上找到的X.Parse或X.TryParse方法。

在基礎知識之上,你會得到一個可擴展的框架,你可以在其他的東西寫你自己的類型轉換。 ASP.NET MVC框架大量使用這個命名空間來處理它的類型轉換,例如查詢字符串值轉換爲方法參數。

+0

這看起來很有趣@James,我會試着找到更多關於它的信息。 – Marko 2010-10-13 02:27:50

+1

+1,我相信這只是一個錯字,NEWVALUE應該是目標類型和的ConvertTo() – 2010-10-13 03:32:17

+0

@克里斯Talyor的結果同樣投:正確。該帖子已更新。謝謝。 – 2010-10-13 04:34:53