这是您的第一种方法的 MSIL 外观:
.method public hidebysig static string GetString(class [System.Data]System.Data.IDataReader rdr,
string columnName) cil managed
{
// Code size 49 (0x31)
.maxstack 2
.locals init ([0] int32 ordinal,
[1] string CS$1$0000,
[2] bool CS$4$0001)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldarg.1
IL_0003: callvirt instance int32 [System.Data]System.Data.IDataRecord::GetOrdinal(string)
IL_0008: stloc.0
IL_0009: ldarg.0
IL_000a: ldloc.0
IL_000b: callvirt instance bool [System.Data]System.Data.IDataRecord::IsDBNull(int32)
IL_0010: ldc.i4.0
IL_0011: ceq
IL_0013: stloc.2
IL_0014: ldloc.2
IL_0015: brtrue.s IL_0020
IL_0017: nop
IL_0018: ldsfld string [mscorlib]System.String::Empty
IL_001d: stloc.1
IL_001e: br.s IL_002f
IL_0020: ldarg.0
IL_0021: ldloc.0
IL_0022: callvirt instance object [System.Data]System.Data.IDataRecord::get_Item(int32)
IL_0027: castclass [mscorlib]System.String
IL_002c: stloc.1
IL_002d: br.s IL_002f
IL_002f: ldloc.1
IL_0030: ret
} // end of method Program::GetString
对于您的第二种方法:
.method public hidebysig static string GetStringShort(class [System.Data]System.Data.IDataReader rdr,
string columnName) cil managed
{
// Code size 18 (0x12)
.maxstack 2
.locals init ([0] string CS$1$0000)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldarg.1
IL_0003: callvirt instance object [System.Data]System.Data.IDataRecord::get_Item(string)
IL_0008: castclass [mscorlib]System.String
IL_000d: stloc.0
IL_000e: br.s IL_0010
IL_0010: ldloc.0
IL_0011: ret
} // end of method Program::GetStringShort
所以方法肯定不一样。至于哪个更好,你没有说为什么要计算序数,所以很难说哪个更适合你的情况。