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 は異なりますが、それらの間に顕著な違いがあるとは思えません。100万回の反復後に違いがわかるかもしれませんが、そうではありません。

于 2008-12-29T20:46:12.343 に答える
1

reader[0] は System.Object を返します。(int)reader[0] は実際には Object から Int32 へのキャストを行っています。

GetXXX(0) メソッドを呼び出した場合、変換は実行されません。したがって、ストリームから取得されたデータは、メソッドで指定された型である必要があります。

取得したデータの型が一致しない場合、または列に DBNull がある場合、InvalidCastException がスローされます。

于 2008-12-29T22:22:39.247 に答える
1

前者は、列名をインデックスではなく文字列として受け入れることもでき、列の値を int にキャストしようとします。後者はインデックスのみを受け入れ、キャストは実行されません。

于 2008-12-29T20:45:27.337 に答える