passage par référence, sans le mot-clé ref
Je ne suis pas un vétéran dans le support de la programmation, de sorte que lors de l'analyse de code que j'ai trouvé dans une base de données de l'API, je suis tombé sur ce code
public static void WriteInt(int i, NetworkStream bufOutputStream)
{
byte[] buffer = new byte[IntSize];
WriteInt(i, buffer, 0);
bufOutputStream.Write(buffer, 0, buffer.Length);
}
public static void WriteInt(int i, byte[] byte_array, int pos)
{
byte_array[pos] =(byte)( 0xff & (i >> 24)); byte_array[pos+1] = (byte)(0xff & (i >> 16)); byte_array[pos+2] = (byte)(0xff & (i >> 8)); byte_array[pos+3] = (byte)(0xff & i);
}
Je comprends le peu-quarts de ce que je ne comprends pas comment le "tampon" var continue à obtenir une valeur lorsque aucune ref est dans le args ou aucune déclaration n'est faite. le bitshifts sont en quelque sorte l'édition de la valeur réelle de tampon?
Voir aussi stackoverflow.com/questions/2058161/...
OriginalL'auteur jtzero | 2010-01-20
Vous devez vous connecter pour publier un commentaire.
Votre confusion est très fréquent. Le point essentiel est de réaliser que "les types de référence" et "en passant par refrence" (
ref
clavier) sont totalement indépendant. Dans ce cas précis, depuisbyte[]
est un type de référence (comme le sont tous les tableaux), il signifie que l'objet n'est pas copiée lors de la passer autour, donc vous êtes toujours référence au même objet.Je vous recommande fortement de lire Jon Skeet l'excellent article sur passage de paramètres en C#, et tout devrait être clair...
OriginalL'auteur Noldorin
Car un tableau n'est pas un type de valeur, c'est un type de référence. La référence à l'emplacement sur le tas est passé par valeur.
byte[] est une sous-classe de Système.Tableau, qui est un type de référence.
Les types de référence sont toujours passés par référence, les types de valeur sont toujours passés par valeur... Sauf si vous utilisez
ref
ouout
, d'où la raison derrière l'existence de ces mots-clés. En les ajoutant à une référence argument, c'est comme un floue crayon.Ceci est incorrect. Ne pas confondre les types de référence avec le passage par référence... ils sont totalement indépendants.
C'est le moment...
OriginalL'auteur Yuriy Faktorovich
Je pense que certains exemples peuvent vous montrer les différences entre les types de référence et des types de valeur et entre le passage par référence et le passage par valeur:
OriginalL'auteur Sergey Teplyakov
La meilleure façon de penser est de penser à la variables. Les Variables sont, par définition, emplacements de stockage. Quelles sont les emplacements de stockage dans votre programme? Ils sont:
La byte_array emplacement de stockage et le tampon de l'emplacement de stockage sont différents emplacements de stockage. Mais le byte_array emplacement de stockage contient une référence à la même matrice que le tampon de l'emplacement de stockage se réfère. Par conséquent tampon[0] et byte_array[0] reportez-vous à la même emplacement de stockage.
Il suffit de penser les emplacements de stockage, et il va tous les sens.
OriginalL'auteur Eric Lippert
C# est comme Java dans ce type de référence variables sont en fait des pointeurs. Vous passez toujours par valeur, mais avec des types de référence de la valeur de l'emplacement de l'objet, plutôt que l'objet lui-même. Le mot-clé ref sur un type de référence est le passage du pointeur par référence, donc, à une cession à un paramètre de référence va changer ce que l'objet de l'argument passé dans points à.
OriginalL'auteur Sean
Tableaux .Net sont des types référence.
Par conséquent, votre fonction reçoit une référence à l'objet de tableau par valeur. Puisqu'il n'est toujours qu'une seule occurrence de tableau, la fonction peut modifier l'instance et les modifications seront vu l'appelant.
L'ajout de la
ref
mot-clé, la fonction recevoir une référence à l'objet array par référence, et permettrait ainsi de la fonction à modifier la référence pour faire référence à une autre occurrence de array.En d'autres termes, la
ref
mot-clé vous permettra d'écrire ce qui suit:À démontrer:
OriginalL'auteur SLaks
byte_array est un type de référence.
OriginalL'auteur Ariel
Comme Yuriy Faktorovich dit, les types de valeur (comme int, char, boolean ecc.) sont passés par défaut par la valeur (sauf si vous spécifiez ref)
tous les autres types (les tableaux et les Objets sont passés par défaut par référence
dans votre exemple, si u modifier les valeurs à l'intérieur du tableau, il sera de refléter les changements aussi en dehors de la méthode, mais vous ne pouvez pas réaffecter l'objet.
une référence à ce sujet est en MSDN
OriginalL'auteur p4bl0