4

(int)reader[0]替换为 有什么好处reader.GetInt32(0)?我敢肯定这种铸造功能的存在是有原因的,但除了自己避免铸造在美学上更令人愉悦之外,我不确定这些原因是什么。

4

3 回答 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 回答