Est-ce que le passage d'un type de valeur dans un « out » paramètre à cause de la variable en boîte?

StackOverflow https://stackoverflow.com/questions/4807086

Question

Je suis conscient que boxe et unboxing sont relativement coûteux en termes de performance. Ce que je me demande est:

Est-ce que le passage d'un type de valeur au paramètre out cause une méthode de boxe / unboxing de la variable (et donc une baisse de performance)? Peut-Optimize du compilateur de cette distance?

  int number;
  bool result = Int32.TryParse(value, out number);
Était-ce utile?

La solution

Comme d'autres ont en pointe, il n'y a pas de boxe ici. Lorsque vous passez une variable comme un argument correspondant à un paramètre out ou ref, ce que vous faites est faire un alias à la variable . Vous ne faites rien à la valeur de la variable. Vous faites deux variables représentent le même emplacement de stockage.

Boxe ne se produit que lorsqu'une valeur d'un type de valeur est convertie en une valeur d'un type de référence, et il n'y a pas de conversion d'aucune sorte dans votre exemple. Le type de référence doit évidemment être System.Object, System.ValueType, System.Enum ou toute interface. Habituellement, il est assez clair; il y a une conversion explicite ou implicite dans le code. Cependant, il peut y avoir des circonstances où il est moins clair. Par exemple, lorsqu'un non-surchargée méthode virtuelle du type de base d'un struct est appelé, il y a la boxe. (Il y a aussi des situations bizarres où certains types de contraintes de type générique peuvent provoquer la boxe inattendue, mais ils ne viennent généralement pas dans la pratique.)

Autres conseils

n boxe, compilateur utilise l'instruction ldloca.s qui pousse une référence à la variable locale sur la pile (http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldloca_s (VS.71) .aspx)

.method private hidebysig static void Func() cil managed
{
    .maxstack 2
    .locals init (
        [0] int32 num,
        [1] bool flag)
    L_0000: nop 
    L_0001: ldstr "5"
    L_0006: ldloca.s num
    L_0008: call bool [mscorlib]System.Int32::TryParse(string, int32&)
    L_000d: stloc.1 
    L_000e: ret 
}

Non, il n'y a pas de boxe (obligatoire / impliqué).

Lorsque vous faites une variable boîte, des modifications à l'instance en boîte ne touchent pas l'original. Mais c'est exactement ce que out est censé faire.

Le compilateur « en quelque sorte » construit une référence à la variable d'origine.

Il n'y a pas de boxe; ce que le paramètre est out ne spécifie que le numéro doit être affecté à l'intérieur de la méthode TryParse. Indépendamment de cela, il est toujours traité comme un int, pas object.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top