数据表中命名字段和命名列之间的差异

时间:2016-05-24 09:14:04

标签: c# datatable

请问以下两者有什么区别?

var dtime = (DateTime)datatable[0]["SomeDateTime"];
var dtime = datatable[0].field<DateTime>("SomeDateTime");

EDIT 而这:

var dtime = Convert.ToDateTime(datatable[0]["SomeDateTime"]);

3 个答案:

答案 0 :(得分:3)

不同之处在于,第一个使用自己的显式投射而第二个投射在DataRow扩展方法Field的幕后。

因此,如果datetime-column可以包含空值,则可以使用DateTime?

DateTime? dtime = datatable.Rows[0].Field<DateTime?>("SomeDateTime");

所以我建议使用Field。它是强类型的(隐藏演员表)并支持可空类型。通过(TypeName)显式投射也不太可读。

答案 1 :(得分:1)

在第一行

var dtime = (DateTime)datatable[0]["SomeDateTime"];

使用返回object的indexer属性。所以你需要自己把它投射到你期望对象的实际类型。

第二种情况

var dtime = datatable[0].Field<DateTime>("SomeDateTime");

调用尝试为您执行转换的泛型扩展方法Field<T>并返回您指定的类型(因此在示例中为DateTime)。

您可以检查参考源中indexerField<T>() extension method

的不同实现

答案 2 :(得分:0)

给出的例子之间的主要区别是转换方法

(Type)接受你所拥有的任何类型并迫使它成为那种类型,错误地说它不合适

<Type>传递一个泛型类型,用于在无类型定义中使用字段的实现,这意味着有幕后逻辑帮助你转换

Convert.ToType()正在使用转换器类进行转换,因为它的调用要求类型与I​​Convertable接口兼容,这意味着有人已经考虑使该类型可转换,这意味着你可能得到一个成功的结果

否则您只是使用不同的方法来访问命名字段(this属性或字段方法