C'est une excellente question!
La boxe se produit exactement pour la raison suivante: lorsque nous avons besoin d'une référence à un type de valeur. Tout ce que vous avez énumérés, appartient à cette règle.
Par exemple, puisque l'objet est un type de référence, la conversion d'une valeur de type d'objet nécessite une référence à un type de valeur, ce qui provoque la boxe.
Si vous souhaitez la liste de tous les scénarios possibles, vous devez également inclure les produits dérivés, tels que les retournant une valeur de type à partir d'une méthode qui renvoie un objet ou un type d'interface, car cela jette automatiquement le type de la valeur de l'objet ou de l'interface.
Par ailleurs, la concaténation de chaîne le cas où vous astucieusement identifié dérive aussi de la conversion en objet. L'opérateur + est traduite par le compilateur pour un appel à la méthode Concat de la chaîne, qui accepte un objet pour le type de valeur que vous passer, donc la conversion de l'objet et donc de boxe se produit.
Au fil des années, j'ai toujours conseillé aux développeurs de se rappeler la raison de la boxe (j'ai précisé ci-dessus) au lieu de mémoriser tous les cas, parce que la liste est longue et difficile à retenir. Cela favorise aussi la compréhension de ce qu'IL code, le compilateur génère pour notre code C# (par exemple + sur la chaîne entraîne un appel à la Chaîne.Concat). Lorsque votre e dans le doute sur ce que le compilateur génère et si de la boxe se produit, vous pouvez utiliser IL Désassembleur (ILDASM.exe). En général, vous devriez regarder pour la zone opcode (il y a un seul cas où la boxe pourrait se produire même si IL ne comprend pas la zone de l'opcode, plus de détails ci-dessous).
Mais je suis d'accord que certains de boxe occurrences sont moins évidentes. Vous énumérées l'une d'entre elles: l'appel d'une non-méthode de remplacement d'un type valeur. En fait, c'est moins évident pour une autre raison: lorsque vous vérifiez le code IL vous ne voyez pas la boîte de opcode, mais la contrainte de l'opcode, de sorte que même dans le IL il n'est pas évident que la boxe qui se passe! Je ne rentrerai pas dans les détails pourquoi pour éviter cette réponse de devenir encore plus longtemps...
Un autre cas pour le moins évident, la boxe est lors de l'appel d'une méthode de classe de base d'une structure. Exemple:
struct MyValType
{
public override string ToString()
{
return base.ToString();
}
}
Ici ToString est remplacée, donc appeler ToString sur MyValType ne génère pas de la boxe. Cependant, la mise en œuvre des appels à la base de ToString et que les causes de boxe (vérifier l'IL!).
Par ailleurs, ces deux non-évident de boxe scénarios proviennent également de la règle ci-dessus. Lorsqu'une méthode est appelée sur la classe de base d'un type de valeur, il doit y avoir quelque chose pour ce mot-clé de référence. Depuis la classe de base d'un type de valeur est (toujours) un type de référence, ce mot-clé doit se référer à un type de référence, et donc nous avons besoin d'une référence à un type de valeur et donc de boxe se produit en raison de la règle unique.
Voici un lien direct vers l'article de mon en ligne .NET cours qui traite de la boxe dans le détail: http://motti.me/mq
Si vous êtes uniquement intéressé par plus avancé de boxe scénarios voici un lien direct (si le lien ci-dessus vous y emmène ainsi une fois qu'il aborde le plus de trucs de base): http://motti.me/mu
J'espère que cela aide!
Motti