2008-11-12 158 views
3

我目前正在重構代碼以將Convert.To's替換爲TryParse。使用TryParse設置對象屬性值

我遇到了以下代碼創建和分配屬性的對象。

List<Person> list = new List<Person>(); 

foreach (DataRow row in dt.Rows) 
{ 
    var p = new Person{ RecordID = Convert.ToInt32(row["ContactID"]) }; 

    list.Add(p); 
} 

我想出的更換:

var p = new Person { RecordID = Int32.TryParse(row["ContactID"].ToString(), out RecordID) ? RecordID : RecordID }; 

任何想法,意見,替代我做了什麼?

+0

不完全可讀 - 但如果它的工作...... – DilbertDave 2008-11-12 14:21:24

+0

我同意迪爾伯特。我認爲單線版很難閱讀,並且嘗試編輯或者在調試中逐步完成會很痛苦。 TryParse確實聽起來像是一種改進。 – DOK 2008-11-12 14:26:54

+0

由於ContactID是數據庫中的主鍵,轉換爲Int32將始終成功。 TryParse的使用會誤導代碼的維護者,因爲它意味着轉換有時會失敗,但情況並非如此。我會堅持Convert.ToInt32。 – 2008-11-12 15:31:42

回答

6

寫一個擴展方法。

public static Int32? ParseInt32(this string str) { 
    Int32 k; 
    if(Int32.TryParse(str, out k)) 
     return k; 
    return null; 
} 
1

我會用另一種實現TryParse返回一個int?

public static int? TryParseInt32(string x) 
{ 
    int value; 
    return int.TryParse(x, out value) ? value : (int?) null; 
} 

然後,你可以寫:

var p = new Person { RecordID = Helpers.TryParseInt32(row["ContactID"].ToString()) ?? 0 }; 

(或使用不同的默認值,如果你想 - 無論哪種方式,它會在您的代碼中可見。)

0

我建議s分離初始化程序中的TryParse部分。它會更具可讀性。

int recordId; 
Int32.TryParse(row["ContactID"].ToString(), out recordID) 

foreach (DataRow row in dt.Rows) 
{ 
    var p = new Person{ RecordID = recordId }; 
    list.Add(p); 
} 
相關問題