Si j'ai ce code:C#: Combien de fois la valeur foreach est appelée?
foreach (Char c in myString.ToLowerInvariant())
{ /* code */ }
Combien de fois myString.ToLowerInvariant()
appelée? Une fois (que je suppose) ou plusieurs fois?
Si j'ai ce code:C#: Combien de fois la valeur foreach est appelée?
foreach (Char c in myString.ToLowerInvariant())
{ /* code */ }
Combien de fois myString.ToLowerInvariant()
appelée? Une fois (que je suppose) ou plusieurs fois?
réponse courte: Une fois
Réponse longue:
Le code est compilé dans l'IL suivant. Vous pouvez l'essayer vous-même en compilant le fichier C# puis en l'ouvrant dans ILDASM (distribué avec Visual Studio) ou .NET Reflector (qui peut afficher le code désassemblé dans de nombreuses langues et dispose d'infobulles pour les instructions IL avec description détaillée).
L_0008: ldloc.0
L_0009: callvirt instance string [mscorlib]System.String::ToLowerInvariant()
L_000e: stloc.2
L_000f: ldc.i4.0
L_0010: stloc.3
L_0011: br.s L_0021
L_0013: ldloc.2
L_0014: ldloc.3
L_0015: callvirt instance char [mscorlib]System.String::get_Chars(int32)
L_001a: stloc.1
L_001b: nop
L_001c: nop
L_001d: ldloc.3
L_001e: ldc.i4.1
L_001f: add
L_0020: stloc.3
L_0021: ldloc.3
L_0022: ldloc.2
L_0023: callvirt instance int32 [mscorlib]System.String::get_Length()
L_0028: clt
L_002a: stloc.s flag
L_002c: ldloc.s flag
L_002e: brtrue.s L_0013
la condition de boucle réelle est vérifiée sur des lignes L_0021 à L_002c et puis il y a saut à la ligne L_002e qui est exécutée, sinon tous les caractères sont encore traités. Notez qu'il saute à L_0013 qui est après l'appel ToLowerInvariant.
une fois ... puis une boucle à travers chacune des valeurs qui se sont retournés par l'appel