C# assignation par référence
Est-il possible d'assigner par référence? Je sais que la ref doit être utilisé dans les méthodes.
string A = "abc";
string B = A;
B = "abcd";
Console.WriteLine(A); //abc
Console.WriteLine(B); //abcd
Puis-je avoir une sorte de
string A = "abc";
string B = (ref)A;
B = "abcd"; //A was assigned to B as reference, so changing B is the same as changing A
Console.WriteLine(A); //abcd
Console.WriteLine(B); //abcd
double possible de stackoverflow.com/questions/1219664/...
Je pense qu'il s'attend à la valeur de "abcd" à attribuer à A.
Oui je suis
double possible de C# de référence de l'opérateur d'affectation?
Je pense qu'il s'attend à la valeur de "abcd" à attribuer à A.
Oui je suis
double possible de C# de référence de l'opérateur d'affectation?
OriginalL'auteur Marin | 2012-03-20
Vous devez vous connecter pour publier un commentaire.
Vous n'êtes pas la modification de la référence à A. Vous êtes la création d'une toute nouvelle chaîne. Une affiche toujours "abc", car il ne peut pas être changé en modifiant B. une Fois que vous modifiez B, il pointe vers un tout nouvel objet. Les chaînes sont immuables trop, de sorte que toute modification à l'un crée une nouvelle chaîne.
Pour encore répondre à votre question, non immuable types de référence, il est possible de modifier les propriétés d'un objet à une variable de points pour afficher le changé effet lorsque vous accédez à d'autres variables pointant vers le même objet. Cela ne signifie cependant pas que vous pouvez avoir une variable point d'une nouvelle marque de l'objet, et à d'autres variables (qui a souligné l'ancien objet) point de ce nouvel objet automatiquement sans les modifier.
B
variable. Ce serait la même chose si b est de typeList<int>
.ouais j'ai écrit trop vite. Je crois que c'est un peu plus clair.
OriginalL'auteur kemiller2002
C'est la façon dont il fonctionne déjà. Les chaînes sont un type de référence - votre la variable a est Une référence (comme un pointeur vers une chaîne de caractères sur le tas, et vous êtes tout simplement copier la valeur du pointeur (l'adresse de la chaîne) dans la variable B.
Votre exemple ne change pas la valeur de Un lorsque vous affectez des "abcd" de B parce que les chaînes de caractères sont traités spécialement .net. Ils sont immuables, comme Kevin points, mais il est également important de noter qu'ils ont une valeur de type sémantique, c'est-affectations toujours la référence vers une nouvelle chaîne, et ne change pas la valeur de la chaîne existante stockée dans la variable.
Si, au lieu de Chaînes de caractères, vous avez utilisé (par exemple), les voitures, et a changé de propriété, vous pouvez voir ce qui est le cas:
Il est sans doute intéressant de noter qu'il ne fonctionne pas de cette façon pour les types de valeur (entiers, des doubles, des flotteurs, des longs, les décimales, les booléens, les structures, etc). Ceux-ci sont copiés par valeur, sauf s'ils sont en boîte comme un
Object
.OriginalL'auteur Chris Shain
Les chaînes sont immuables, c'est vrai. Cependant, vous pouvez résoudre votre problème en encapsulant chaîne à l'intérieur d'une classe et de faire des A et B les instances de cette classe. Alors A = B devrait fonctionner.
OriginalL'auteur the_joric
Chaînes sont déjà des références, après B = A puis B. equals () retournera true. Toutefois, lorsque vous n'B = "abcd" vous êtes en train de faire la même chose, vous assignez B à une référence à la chaîne de caractères littérale.
Ce que vous êtes désireux de faire est de modifier les données pointées par la chaîne, cependant, parce que les Chaînes .NET sont immuables, il n'y a aucun moyen de le faire.
OriginalL'auteur joshperry
OriginalL'auteur Joel Coehoorn
Les chaînes de caractères sont des objets spéciaux en C# parce qu'ils sont immuables, sinon il serait par référence. Vous pouvez exécuter cet extrait à voir.
OriginalL'auteur Anurag Ranjhan