0
votes

C # Tapez les références (vs c)

Comment les références C # fonctionnent si, les classes sont des références
classe1 a = nouvelle classe1 ();
donc adresse nommée "A" contient Adresse de l'objet indiquant MEM [0], c'est donc un pointeur

pourquoi xxx

copie la valeur de l'objet à une instance de méthode locale et non d'adresse de MEM [0] ?
Est-ce que cela est implicitement de référence ( * ) a? Si oui, alors ref modificateur annule le modificateur?

permet de dire qu'une classe définit un type d'adresse aux adresses qui pointent à différents points d'un objet. Je ne peux toujours pas aller à la fin ...


0 commentaires

3 Réponses :


2
votes

pourquoi méthode (classe1 a) code> Copie la valeur de l'objet à une méthode locale p>

C'est une hypothèse erronée. Le paramètre de méthode A code> contient une référence à l'objet. Si vous utilisez la méthode (refanche de classe1 a) code>, vous obtenez une référence à la variable transmise à la méthode, qui contient à son tour une référence à l'objet p>

donné p >

void method(class1 b)
{
    b = new class1(); // This does NOT change a.

    // But
    b.IntProperty = 5; // This changes a property of a.
}


3 commentaires

"La référence à l'objet est adoptée par référence" - je pense que vous faites des choses trop compliquées. La variable est transmise par référence pour tous les paramètres ref , qu'il s'agisse d'un type de valeur ou d'un type de référence. Il est important que ce soit la variable spécifiée comme argument qui est adopté par référence - non seulement une "référence à l'objet". S'il y a deux variables a et B dont les valeurs se réfèrent à la même objet et que vous appelez méthode (ref a) cette méthode peut Modifiez la valeur de A , mais il ne peut pas modifier la valeur de B .


@ Jonskeet, pas facile à expliquer (vous êtes beaucoup mieux dans cette discipline). J'ai repoussé ma réponse.


Définitivement mieux.



1
votes

Vous devrez comprendre comment les méthodes sont appelées et comment les objets sont alloués dans la mémoire.

Tous les types de classe sont des types de référence en C # - héritant de System.Object forts>. P>

prend en charge toutes les classes de la hiérarchie de la classe .NET Framework et fournit des services de bas niveau aux cours dérivés. Ceci est le ultime classe de base de toutes les classes dans le cadre .NET; C'est la racine de la Type hiérarchie. P> blockQuote>

référence: MSDN Documentation de System.Object P>

Signification, ils seraient alloués dans le tas. Leur référence serait copiée à un endroit. La variable contient cet endroit où la référence est copiée. P>

En cas d'appel de méthode, l'adresse d'un objet est copiée dans la pile d'appel. Il pointe de la même adresse. p>

Donc, si vous changez de propriété (de type de valeur) de la classe, vous pourrez toujours accéder à la valeur modifiée de la méthode de l'appelant - même si vous n'utilisez pas de mot-clé ref. p >

void Method(Class A)


3 commentaires

Je ne sais pas ce que vous entendez par «Par défaut, toutes les valeurs sont des types de référence en C #» - pendant que je ne le comprends pas, je ne peux pas dire si je suis d'accord avec cela.


C'est toujours étrange - parce que "par défaut" suggère que c'est possible d'avoir des types de classe qui ne sont pas des types de référence, et ce n'est pas le cas.


Définitivement mieux.



1
votes

Oui, vous voudrez peut-être réfléchir à des variables de la classe C # sous forme d'indicateurs (sûrs) C, en ce sens. Ils ne vous permettent tout simplement pas de manipuler là où ils pointent en mémoire (le temps d'exécution est même autorisé à réaffecter et à les déplacer).

Si votre class1 est un type de classe (par opposition à un type de structure ou de l'appréciage), vous ne devez toutefois pas corriger que méthode copiera l'ensemble . un objet . Il agira plutôt comme si vous aviez passé un pointeur en C. mais comme dans C, * p1 == * p2 et p1 == p2 mais & p1 ! = & p2

Étant donné que les variables de classe stockent de simples références (similaires aux indicateurs C), si méthode mutate l'objet référé par A , ces mutations resteront après méthode retourne. Le passage d'une variable de classe par REF est ensuite analogue à la transmission d'un pointeur à un pointeur en C; Mais cela peut peine être une bonne idée de design en C #.

Voici comment la classe les variables se comportent (y compris les chaînes). Cependant, il existe également des types de valeur (tous types de base, à l'exception des chaînes et des objets, ainsi que des structures) copiées lorsqu'elles sont copées ou transmises à des méthodes, sauf réussi avec un qualificatif tel que ref ou out code>.

Lecture ultérieure:


4 commentaires

"Les variables de classe sont transmises par référence" - Non, ils ne sont pas. La valeur de la variable (la référence) est transmise par la valeur. Dire qu'ils sont passés par référence impliquent que l'ajout ref à un paramètre de type de référence ne ferait aucune différence, et ce n'est pas vrai.


«Les objets d'un type de classe sont passés par référence» ne convient pas beaucoup mieux. Ce n'est vraiment pas si compliqué: la valeur d'une variable de type de référence est une référence, pas un objet. L'objet n'est pas réussi du tout: une référence est transmise par valeur, ou la variable est transmise par référence (pour un paramètre ref ). Parler de l'objet adopté par référence finit par être plus compliqué et en difficulté autour des références nulles aussi.


Essayé plus précisément


Mon hypothèse était faux (un cours m'a induit en erreur) ... Méthode (a) Copie en effet la valeur de l'adresse nommée 'A'