Je souhaite utiliser une classe comme clé pour un dictionnaire. Mais la classe est grande en termes de consommation de mémoire. Donc, je veux savoir que lorsque nous ajoutons un objet comme clé du dictionnaire, il ajoute uniquement sa référence ou une copie complète est ajoutée. Comme, si la copie complète de l'objet est ajoutée, je peux simplement utiliser le hashcode de l'objet.
3 Réponses :
Réponse modifiée: Le dictionnaire C # stocke uniquement les références à ces instances de classe et les codes de hachage du type de clé. Il ne stocke pas les valeurs réelles elles-mêmes.
Non, les types de référence ne sont pas passés par référence. La référence est passée par valeur. Voir jonskeet.uk/csharp/parameters.html
"stocke les objets clés et valeurs réels" Eeehm, cela ne contredit-il pas votre déclaration "stocke les objets clés et valeurs réels"? Donc, au moins pour les types de référence, les objets réels ne sont pas passés.
En dehors de ce où l'instance est réellement stockée (tas ou pile) n'affecte pas vraiment comment cette instance est transmise.
Dans un sens, c'est le cas. Lorsque vous effectuez un dict.Add (clé, valeur) , vous passez des instances soit par valeur, soit par référence. S'il s'agit d'un int , il est passé par valeur. S'il s'agit d'une instance d'une classe, elle est passée par référence. Ainsi, le dictionnaire le reçoit comme tel et le stocke comme tel.
@ Dandré: Non, vous passez une référence , par valeur . Veuillez lire le lien que j'ai posté plus tôt. (Dans votre modèle du monde, comment parlerais-tu d'une méthode avec une signature de void Foo (ref string name) ?)
@JonSkeet. Oui, vous passez par référence, vous ne transmettez pas la valeur / le contenu réel. De la même manière, vous ne passez pas une instance de classe comme une structure, mais vous transmettez la référence au contenu. Cependant, je suppose que je pourrais passer l'instance de classe dans une méthode utilisant le ref et c'est probablement là que mon argument tombe à plat. J'ai donc besoin de mettre à jour ma terminologie. J'ai tellement l'habitude de dire "en passant par ref ou par val".
@ Dandré: Vous ne passez jamais une instance par valeur ou référence. Vous passez une valeur (que ce soit une valeur de type valeur ou une référence) par valeur, ou vous passez une variable par référence.
@JonSkeet. Compris et noté. Merci.
Je recommanderais simplement de supprimer tout ce qui suit le premier paragraphe de votre réponse, car je soupçonne que cela créera plus de confusion.
Le dictionnaire stocke toute valeur transmise - c'est le cas à la fois pour la clé et la valeur de l'entrée. Pour les types référence, cette valeur est une référence - aucun clonage n'est impliqué pour copier l'objet auquel la référence fait référence. Voici un exemple:
var dictionary = new Dictionary<int, StringBuilder>();
var builder = new StringBuilder("x");
dictionary.Add(5, builder);
// Retrieve the reference from the dictionary and append to it
dictionary[5].Append("y");
Console.WriteLine(builder); // Prints xy
Cela montre le côté valeur des choses. La clé est stockée de la même manière - en tant que référence - mais il y a une mise en garde ici ... si vous mutez l'objet auquel une clé fait référence, cela va fondamentalement casser le dictionnaire dans la plupart des cas, comme le code de hachage de la clé est calculé lorsque l'entrée est ajoutée. Généralement, vous utilisez des types immuables (comme string ) comme clés pour les dictionnaires.
Je pense que la question concernait spécifiquement la clé , donc un nouveau dictionnaire sera meilleur comme exemple.
Dans le cas de types référence, les références à la clé et à la valeur seront stockées dans entrée struct. La différence entre la clé et la valeur est que nous utilisons a > comparateur sur la clé pour la garder unique. La seule chose qui est copiée est le pointeur (référence) vers la mémoire où se trouve cet objet.
Le code de hachage n'est pas utilisé pour l'unicité, et ne peut pas l'être, car plusieurs objets non égaux peuvent avoir le même code de hachage.
À votre avis, que signifie le terme «type de référence»? Seules les références aux objets sont fournies. Quoi qu'il en soit, un dictionnaire - qui est basé sur le hachage - utilise le haschode de toute façon, vous n'aurez donc pas besoin de l'utiliser vous-même. Vous devez absolument rechercher des types de référence et des types de valeur.