2008-11-12 121 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); 
}