(int)reader[0]
替换为 有什么好处reader.GetInt32(0)
?我敢肯定这种铸造功能的存在是有原因的,但除了自己避免铸造在美学上更令人愉悦之外,我不确定这些原因是什么。
Brian
问问题
2299 次
3 回答
5
在代码中......
void OneWay()
{
System.Data.SqlClient.SqlDataReader reader = null;
int i = reader.GetInt32(0);
}
void OtherWay()
{
System.Data.SqlClient.SqlDataReader reader = null;
int i = (int)reader[0];
}
在伊利诺伊州
.method private hidebysig instance void OneWay() cil managed
{
.maxstack 2
.locals init (
[0] class [System.Data]System.Data.SqlClient.SqlDataReader reader,
[1] int32 i)
L_0000: nop
L_0001: ldnull
L_0002: stloc.0
L_0003: ldloc.0
L_0004: ldc.i4.0
L_0005: callvirt instance int32 [System.Data]System.Data.Common.DbDataReader::GetInt32(int32)
L_000a: stloc.1
L_000b: ret
}
.method private hidebysig instance void OtherWay() cil managed
{
.maxstack 2
.locals init (
[0] class [System.Data]System.Data.SqlClient.SqlDataReader reader,
[1] int32 i)
L_0000: nop
L_0001: ldnull
L_0002: stloc.0
L_0003: ldloc.0
L_0004: ldc.i4.0
L_0005: callvirt instance object [System.Data]System.Data.Common.DbDataReader::get_Item(int32)
L_000a: unbox.any int32
L_000f: stloc.1
L_0010: ret
}
所以,IL 是不同的,但我怀疑它们之间是否存在任何明显的差异。也许在一百万次迭代之后你会看到差异,但不太可能。
于 2008-12-29T20:46:12.343 回答
1
前者还可以接受列名作为字符串而不是索引,并尝试将列值转换为 int。后者只接受索引并且不会执行转换。
于 2008-12-29T20:45:27.337 回答
1
reader[0] 返回一个 System.Object,(int)reader[0] 实际上是从 Object 转换为 Int32。
如果您调用 GetXXX(0) 方法,则不会执行任何转换。因此,从流中检索的数据必须已经是方法指定的类型。
如果检索到的数据类型不匹配或该列具有 DBNull,则会引发 InvalidCastException。
于 2008-12-29T22:22:39.247 回答