Les références à des variables en C#?
En C++, je peux faire quelque chose comme ceci:
int i[10] = new int[10];
int *p = &i[5];
Puis, je peux toujours savoir que p pointe vers le 5ème élément de tableau int i, quelle que soit j'ai du contenu.
Est-il possible de faire la même chose en C#?
Je réalise que c'est probablement l'une des façons dont C# "protège" nous de nous-mêmes, donc je ne suis pas à la recherche d'une exacte equivelent, mais plutôt un concept similaire... c'est à dire être capable de se référer au contenu d'une autre variable, plutôt que de l'instance de la variable elle-même.
Voici mon cas d'utilisation je suis en train de penser. J'ai un tableau de chaînes de caractères. Je voudrais avoir un autre tableau de références à ces éléments du tableau. Quelque chose comme ceci (évidemment pas de code valide):
string[] s = new string[] { "one", "two", "three", "four", "five", "six" };
stringref[] sr = new stringref[] { &s[0], &s[1], &s[2], &s[3], &s[4], &s[5] };
Console.WriteLine(sr[1]); //== "two"
s[1] = "two point zero";
Console.WriteLine(sr[1]); //== "two point zero"
Certainement, ref paramets ce faire, et les paramètres de sortie vous permettent d'écrire à une variable spécifique. Mais qu'en non-paramètres? Pouvez-vous garder une ref? Pouvez-vous garder un tableau de références ou d'un dictionnaire?
Il semble comme si la capacité à le faire avec des paramètres est présent, il doit être un moyen de le faire sans eux.
int *p = &i[5]
attribue le adresse de la cinquième élément du tableau i
à la variable p
, qui est déclaré comme un pointeur vers un int
. Les références ne sont pas les mêmes que les pointeurs. Je ne suis pas sûr au sujet de C#, mais à partir d'un C++ perspective, il n'est pas clair ce que vous demandez.Je pense que c'est assez clair, car tout le monde a compris de quoi je parlais. Les références en C++ sont plus ou moins la même chose que les pointeurs, sauf que vous ne pouvez pas faire des maths ou de la ré-assigner. Peu importe, c# références ne sont pas les mêmes qu'en C++ références, et C# n'a pas de notion de pointeurs (lorsque vous n'utilisez pas le code unsafe), de sorte que les références sont ce que vous pouvez utiliser en C# depuis il n'y a rien d'autre. Aussi, j'ai dit "l'instance de la variable elle-même".
OriginalL'auteur Erik Funkenbusch | 2009-09-14
Vous devez vous connecter pour publier un commentaire.
Pas. Mettre
unsafe
code de côté, qui ne permet pas la tenue de pointeurs vers des emplacements de mémoire, il n'y a aucun moyen de stocker une référence à une variable en C#.ref
etout
arguments sont le seul moyen de prendre une référence, mais vous ne pouvez pas enregistrer de n'importe où.Vous pouvez contourner cette limitation en enveloppant les champs dans un
class
et à l'aide de sa référence à la place. C'est ce que le compilateur ne à la capture de variables dans les bouchons:Par exemple, lorsque vous écrivez:
Dans la deuxième ligne, le compilateur va devoir prendre la méthode anonyme et de le stocker en tant que distincte de la méthode dans la classe. Évidemment, cette méthode n'ont pas accès à
integer
variable. De toute façon il faut passer une "référence" àinteger
variable pour que la méthode anonyme. Puisqu'il n'est pas possible, il va générer unclass
avec un champ de tenir un entier et utilise une instance de cette classe pour stocker la variable. Fondamentalement, la variable locale est promu à un champ dans une classe et est stocké dans le tas.OriginalL'auteur Mehrdad Afshari
Lecture seule référence de tableau:
OriginalL'auteur dalle
En code managé références sont utilisées à la place des pointeurs, comme le garbage collector peut déplacer des objets en mémoire à tout moment.
Une référence à quelque chose qu'il a à être l'objet, de sorte que vous ne pouvez pas avoir des références pour les éléments individuels d'un tableau d'entiers. Comme des chaînes de caractères sont des objets, vous pouvez avoir des références pour les différentes cordes en copiant simplement les références dans le tableau:
Cependant, comme les chaînes de caractères sont des objets immuables vous pouvez uniquement utiliser les références pour lire les articles. Si vous affectez une chaîne de référence dans le rp tableau, vous permettra de remplacer la référence au lieu de changer l'objet vers lequel il pointe.
Si vous souhaitez modifier les objets, vous devrez avoir mutable objets. Par exemple:
"Pour avoir une référence à quelque chose qu'il a à être l'objet, de sorte que vous ne pouvez pas avoir des références pour les éléments individuels d'un tableau d'entiers'. Qui n'est tout simplement pas vrai sur deux niveaux.
De quelle manière pensez-vous que ce n'est pas vrai?
ref var x = ref arr[3]; // c'est tout bon, même dans l'ancienne syntaxe, vous étiez en mesure de passer 'arr[3]" de la fonction par la réf.
OriginalL'auteur Guffa
Si quelqu'un est à la recherche de solution possible.
En jouant un peu avec les génériques, il est possible si vous enveloppez chaque tableau en classe de sorte qu'il peut être affecté à une autre instance de la même envelopper par la classe de référencement de tableau.
Mais cela doit être utilisé uniquement comme une preuve de concept qu'il est possible de le faire.
En général, je ne recommandons pas l'utilisation de cette, mais il propose la refonte du code de manière plus efficace. Aussi, sa vaut la peine de mentionner que vous simplement pouvez affecter tableau à un autre tableau comme référence pour l'un de ses éléments (DOH).
Cela étant dit, voici l'exemple de code de référence générique de tableau de tableau de données:
Aussi si référencé éléments doivent être hors de vue vous pouvez ajouter générique Ref_T classe à enrouler chaque valeur de référence:
sorties:
Espère que cela aide quelqu'un.
OriginalL'auteur SoLaR
Il est possible de réaliser cela à l'aide de délégués. Aujourd'hui, il ne nécessite même pas beaucoup de code:
devient:
effectuer
p()
renvoie toujours le 6ème élément d'indice (5, 0).Nous pouvons également ajouter un peu de sucre:
Appliqué à votre exemple:
.Net Violon
Remarque: bien sûr, dans l'exemple où vous avez une sauvegarde de tableau/liste/de la collection, il serait juste assez pour stocker l'index au lieu d'un
Func<T>
. Peut-être plus rapide. Aussi certains de la liste des implémentations, commeLinkedList<T>
, permettent d'accéder à la structure de la liste.(Coupant les cheveux en quatre: Puis de nouveau le tableau lui-même est une "liste" de références et donc
s[1]
etsr[1]
devrait être équivalente,sr
donc totalement superflu dans l'exemple).OriginalL'auteur BatteryBackupUnit
Je soupçonne que vous vous posez la mauvaise question...
Considérer le code C# suivant:
Dans ce cas, obj est référence au même objet que arr[5], puisque les deux arr[5] et obj sont des références.
La question avec l'exemple de code que vous avez fourni a été que quand vous écrivez "s[1] = "deux point zéro"", vous n'êtes pas en train de changer la chaîne de caractères en mémoire, vous faites référence, dans le tableau, pointez sur une autre chaîne. Fondamentalement, votre code C# est équivalent à celui-ci dans C:
Mais c'EST l'emplacement des données. Le tableau de chaîne est juste l'emplacement de la référence...
Non, vous n'êtes toujours pas la compréhension. Je vous suggère de relire ma question, et les réponses qui leur ont été donnés. Vous me dites quelque chose que je connais déjà. Je sais obj fait référence au même objet. Je suis à la recherche d'un moyen de PAS se référer à l'instance réelle de l'objet, mais de la référence elle-même, de la même manière que les paramètres de ref de travail.
OriginalL'auteur Tal Pressman