Il n'y a pas encore d'informations sur ce qui se passe réellement sous la ceinture. Jetez un œil à cet exemple:
object o = "test";
if (o is string)
{
    var x = (string) o;
}
Cela se traduit par l'IL suivante:
IL_0000:  nop         
IL_0001:  ldstr       "test"
IL_0006:  stloc.0     // o
IL_0007:  ldloc.0     // o
IL_0008:  isinst      System.String
IL_000D:  ldnull      
IL_000E:  cgt.un      
IL_0010:  stloc.1     
IL_0011:  ldloc.1     
IL_0012:  brfalse.s   IL_001D
IL_0014:  nop         
IL_0015:  ldloc.0     // o
IL_0016:  castclass   System.String
IL_001B:  stloc.2     // x
IL_001C:  nop         
IL_001D:  ret   
Ce qui compte ici, ce sont les appels isinstet castclass- tous deux relativement chers. Si vous comparez cela à l'alternative, vous pouvez voir que cela ne fait qu'une isinstvérification:
object o = "test";
var oAsString = o as string;
if (oAsString != null)
{
}
IL_0000:  nop         
IL_0001:  ldstr       "test"
IL_0006:  stloc.0     // o
IL_0007:  ldloc.0     // o
IL_0008:  isinst      System.String
IL_000D:  stloc.1     // oAsString
IL_000E:  ldloc.1     // oAsString
IL_000F:  ldnull      
IL_0010:  cgt.un      
IL_0012:  stloc.2     
IL_0013:  ldloc.2     
IL_0014:  brfalse.s   IL_0018
IL_0016:  nop         
IL_0017:  nop         
IL_0018:  ret  
Il convient également de mentionner qu'un type valeur utilisera unbox.anyplutôt que castclass:
object o = 5;
if (o is int)
{
    var x = (int)o;
}
IL_0000:  nop         
IL_0001:  ldc.i4.5    
IL_0002:  box         System.Int32
IL_0007:  stloc.0     // o
IL_0008:  ldloc.0     // o
IL_0009:  isinst      System.Int32
IL_000E:  ldnull      
IL_000F:  cgt.un      
IL_0011:  stloc.1     
IL_0012:  ldloc.1     
IL_0013:  brfalse.s   IL_001E
IL_0015:  nop         
IL_0016:  ldloc.0     // o
IL_0017:  unbox.any   System.Int32
IL_001C:  stloc.2     // x
IL_001D:  nop         
IL_001E:  ret   
Notez cependant que cela ne se traduit pas nécessairement par un résultat plus rapide comme nous pouvons le voir ici . Il semble y avoir eu des améliorations depuis cette question a été posée si: moulages semblent être effectuées aussi vite qu'ils l' habitude d'être , mais aset linqsont maintenant environ 3 fois plus rapide.
               
              
MyPropgetter après ce changement.