2008-11-12 3 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

Предлагаю отделить Часть 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); 
} 
Смежные вопросы