J'ai une structure avec quelques champs. L'un des champs est d'un type générique. Le type générique peut être soit un type de référence, soit un type de valeur.Forcer un type de valeur (générique) à être une référence
Je veux forcer qu'il est stocké comme une référence interne, pour éviter que la structure devienne trop grande.
struct Foo<T>
{
T field; // should be a reference
}
Je sais que je pourrais utiliser object
ou T[]
, mais les deux est maladroit. N'y at-il pas quelque chose comme un type de référence générique?
struct Foo<T>
{
Reference<T> field;
}
Oui, bien sûr, je pourrais écrire le mien. Mais j'essaie d'éviter cela
Je ne comprends pas comment cela résout le problème. Supposons que S est un type de grande valeur. Alors Foo
est * la même taille * que S. Si l'utilisateur est bien avec la performance de S alors pourquoi ne seraient-ils pas aussi trouver avec la performance de Foo? Boxe S - que vous boxiez avec un objet ou votre propre classe de boxe personnalisée - utilisera * plus * d'espace en général, car vous aurez besoin d'espace pour l'instance de S * et * espace pour la boîte. Boxing S utilisera * plus * de temps, car il faut du temps pour mettre en boîte et unbox S. –Et garder S dans un type de référence ajoutera une pression considérable sur le garbage collector s'il y en a beaucoup. Pouvez-vous expliquer pourquoi vous pensez que c'est une sorte de victoire, parce que cela me semble faire une mauvaise situation - c'est-à-dire, le coût d'une grande structure - loin, bien pire. –
@Eric: Je ne veux pas que la structure devienne trop grande. les structures devraient être petites en utilisation de la mémoire. Il y a d'autres champs dans cette structure et il est déjà sur la limite supérieure. Si T serait un Guid ou un type de valeur encore plus grand, la structure résultante serait trop grande. –