You should benchmark it if you're really interested in this, but...
While it is possible that the JIT compiler will optimize this at run-time, based on looking at the IL it appears that the second is likely quicker (which is what I would have suspected without optimization). There was no difference I could find between Debug and Release mode (optimized) code either.
First method:
Code:
.method private hidebysig instance void Test1(class [System.Xml]System.Xml.XmlDocument doc) cil managed
{
.maxstack 2
.locals init (
[0] class [System.Xml]System.Xml.XmlNode node,
[1] class [mscorlib]System.Collections.IEnumerator CS$5$0000,
[2] bool CS$4$0001,
[3] class [mscorlib]System.IDisposable CS$0$0002)
L_0000: nop
L_0001: nop
L_0002: ldarg.1
L_0003: ldstr "menu"
L_0008: callvirt instance class [System.Xml]System.Xml.XmlNode [System.Xml]System.Xml.XmlNode::SelectSingleNode(string)
L_000d: callvirt instance class [System.Xml]System.Xml.XmlNodeList [System.Xml]System.Xml.XmlNode::get_ChildNodes()
L_0012: callvirt instance class [mscorlib]System.Collections.IEnumerator [System.Xml]System.Xml.XmlNodeList::GetEnumerator()
L_0017: stloc.1
L_0018: br.s L_0080
L_001a: ldloc.1
L_001b: callvirt instance object [mscorlib]System.Collections.IEnumerator::get_Current()
L_0020: castclass [System.Xml]System.Xml.XmlNode
L_0025: stloc.0
L_0026: nop
L_0027: ldloc.0
L_0028: ldstr "@id"
L_002d: callvirt instance class [System.Xml]System.Xml.XmlNode [System.Xml]System.Xml.XmlNode::SelectSingleNode(string)
L_0032: callvirt instance string [System.Xml]System.Xml.XmlNode::get_InnerText()
L_0037: call void [mscorlib]System.Console::WriteLine(string)
L_003c: nop
L_003d: ldloc.0
L_003e: ldstr "@id"
L_0043: callvirt instance class [System.Xml]System.Xml.XmlNode [System.Xml]System.Xml.XmlNode::SelectSingleNode(string)
L_0048: callvirt instance string [System.Xml]System.Xml.XmlNode::get_InnerText()
L_004d: call void [mscorlib]System.Console::WriteLine(string)
L_0052: nop
L_0053: ldloc.0
L_0054: ldstr "@id"
L_0059: callvirt instance class [System.Xml]System.Xml.XmlNode [System.Xml]System.Xml.XmlNode::SelectSingleNode(string)
L_005e: callvirt instance string [System.Xml]System.Xml.XmlNode::get_InnerText()
L_0063: call void [mscorlib]System.Console::WriteLine(string)
L_0068: nop
L_0069: ldloc.0
L_006a: ldstr "@id"
L_006f: callvirt instance class [System.Xml]System.Xml.XmlNode [System.Xml]System.Xml.XmlNode::SelectSingleNode(string)
L_0074: callvirt instance string [System.Xml]System.Xml.XmlNode::get_InnerText()
L_0079: call void [mscorlib]System.Console::WriteLine(string)
L_007e: nop
L_007f: nop
L_0080: ldloc.1
L_0081: callvirt instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
L_0086: stloc.2
L_0087: ldloc.2
L_0088: brtrue.s L_001a
L_008a: leave.s L_00a3
L_008c: ldloc.1
L_008d: isinst [mscorlib]System.IDisposable
L_0092: stloc.3
L_0093: ldloc.3
L_0094: ldnull
L_0095: ceq
L_0097: stloc.2
L_0098: ldloc.2
L_0099: brtrue.s L_00a2
L_009b: ldloc.3
L_009c: callvirt instance void [mscorlib]System.IDisposable::Dispose()
L_00a1: nop
L_00a2: endfinally
L_00a3: nop
L_00a4: ret
.try L_0018 to L_008c finally handler L_008c to L_00a3
}
Second method:
Code:
method private hidebysig instance void Test2(class [System.Xml]System.Xml.XmlDocument doc) cil managed
{
.maxstack 2
.locals init (
[0] class [System.Xml]System.Xml.XmlNode node,
[1] string text,
[2] class [mscorlib]System.Collections.IEnumerator CS$5$0000,
[3] bool CS$4$0001,
[4] class [mscorlib]System.IDisposable CS$0$0002)
L_0000: nop
L_0001: nop
L_0002: ldarg.1
L_0003: ldstr "menu"
L_0008: callvirt instance class [System.Xml]System.Xml.XmlNode [System.Xml]System.Xml.XmlNode::SelectSingleNode(string)
L_000d: callvirt instance class [System.Xml]System.Xml.XmlNodeList [System.Xml]System.Xml.XmlNode::get_ChildNodes()
L_0012: callvirt instance class [mscorlib]System.Collections.IEnumerator [System.Xml]System.Xml.XmlNodeList::GetEnumerator()
L_0017: stloc.2
L_0018: br.s L_0055
L_001a: ldloc.2
L_001b: callvirt instance object [mscorlib]System.Collections.IEnumerator::get_Current()
L_0020: castclass [System.Xml]System.Xml.XmlNode
L_0025: stloc.0
L_0026: nop
L_0027: ldloc.0
L_0028: ldstr "@id"
L_002d: callvirt instance class [System.Xml]System.Xml.XmlNode [System.Xml]System.Xml.XmlNode::SelectSingleNode(string)
L_0032: callvirt instance string [System.Xml]System.Xml.XmlNode::get_InnerText()
L_0037: stloc.1
L_0038: ldloc.1
L_0039: call void [mscorlib]System.Console::WriteLine(string)
L_003e: nop
L_003f: ldloc.1
L_0040: call void [mscorlib]System.Console::WriteLine(string)
L_0045: nop
L_0046: ldloc.1
L_0047: call void [mscorlib]System.Console::WriteLine(string)
L_004c: nop
L_004d: ldloc.1
L_004e: call void [mscorlib]System.Console::WriteLine(string)
L_0053: nop
L_0054: nop
L_0055: ldloc.2
L_0056: callvirt instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
L_005b: stloc.3
L_005c: ldloc.3
L_005d: brtrue.s L_001a
L_005f: leave.s L_007b
L_0061: ldloc.2
L_0062: isinst [mscorlib]System.IDisposable
L_0067: stloc.s CS$0$0002
L_0069: ldloc.s CS$0$0002
L_006b: ldnull
L_006c: ceq
L_006e: stloc.3
L_006f: ldloc.3
L_0070: brtrue.s L_007a
L_0072: ldloc.s CS$0$0002
L_0074: callvirt instance void [mscorlib]System.IDisposable::Dispose()
L_0079: nop
L_007a: endfinally
L_007b: nop
L_007c: ret
.try L_0018 to L_0061 finally handler L_0061 to L_007b
}