Les Objets de passage Par Référence ou la Valeur en C#
En C#, j'ai toujours pensé que les non-primitive variables passées par référence et des valeurs primitives passé par valeur.
Donc, lors du passage à une méthode non-objet primitif, tout ce qui est fait à l'objet dans la méthode de l'effet de l'objet est transmis. (C# 101 trucs)
Cependant, j'ai remarqué que lorsque je passe d'un Système.De dessin.L'Image de l'objet, que ce ne semble pas être le cas? Si je passe d'un système.de dessin.l'image de l'objet à une autre méthode, et de charger une image sur cet objet, alors laissez cette méthode hors de portée et revenir à l'appel de la méthode, que l'image n'est pas chargée sur l'objet d'origine?
Pourquoi est-ce?
- Toutes les variables sont passées par valeur par défaut en C#. Vous êtes de passage à la valeur de référence dans le cas de types de référence.
- Même chose: why-is-list-when-passed-without-ref-to-a-function-acting-like-passed-with-ref
Vous devez vous connecter pour publier un commentaire.
Objets ne sont pas transmis à tous. Par défaut, l'argument est évaluée et son valeur est passé par valeur, comme la valeur initiale du paramètre de la méthode que vous appelez. Maintenant, le point important est que la valeur est une référence pour les types de référence - un moyen d'arriver à un objet (ou null). Modifications de l'objet sera visible à partir de l'appelant. Toutefois, la modification de la valeur de ce paramètre pour faire référence à un autre objet pas être visible lorsque vous êtes en utilisant le passage par valeur, ce qui est la valeur par défaut pour tous types.
Si vous souhaitez utiliser par référence, vous doit utilisation
out
ouref
, si le type de paramètre est une valeur de type ou d'un type de référence. Dans ce cas, effectivement la variable elle-même est passé par référence, de sorte que le paramètre utilise le même emplacement de stockage comme argument - et les modifications du paramètre lui-même sont considérés par l'appelant.Donc:
J'ai un l'article qui va dans beaucoup plus de détails dans ce. Fondamentalement, "passage par référence" ne veut pas dire ce que vous pensez que cela signifie.
ref
etout
à partir de c#, est-il correct de dire que c# passe les paramètres de la même façon que java ne soit toujours par valeur. Quelle est la différence avec java.myobj.Value = null
sera vu par l'appelant parce que j'modification de ses données internes.myobj
est de certains type de référence...)out
mot-clé dans la dernière fonction.out
paramètre.Encore une exemple de code pour mettre en valeur ce:
Et la sortie:
Je suppose que c'est plus clair quand vous le faites comme ça. Je vous recommande de télécharger LinqPad pour tester ce genre de choses.
Et qui devrait sortir
WontUpdate
Prénom: Egli, nom de famille: Becerra
UpdateImplicitly
Prénom: Favio, nom de famille: Becerra
UpdateExplicitly
Prénom: Favio, nom de famille: Becerra
Lorsque vous passer le
System.Drawing.Image
type d'objet à une méthode vous fait passer une copie de la référence à cet objet.Donc, si à l'intérieur de la méthode que vous chargez une nouvelle image à charger à l'aide de nouvelles/copié de référence. Vous n'êtes pas faire de changement dans l'original.
Comment avez-vous passer de l'objet à la méthode?
Faites-vous de nouveau à l'intérieur de cette méthode pour un objet? Si oui, vous devez utiliser
ref
dans la méthode.Lien suivant vous donner une meilleure idée.
http://dotnetstep.blogspot.com/2008/09/passing-reference-type-byval-or-byref.html
En Passer Par Référence de n'ajouter "ref" dans les paramètres de la fonction et un
plus chose que vous devriez être de déclarer la fonction "statique" en raison de la principale est statique(#
public void main(String[] args)
)!La accepté de répondre sonne un peu faux et déroutant. Qu'est ce qu'une "copie d'une référence?"
Comment fait la déclaration suivante a un sens?:
"Toutefois, la modification de la valeur de ce paramètre pour faire référence à un autre objet ne sera pas visible lorsque vous êtes en utilisant le passage par valeur, ce qui est la valeur par défaut pour tous les types." Le passage par valeur n'est pas la valeur par défaut pour tous les types.
Son exemple dans son rapport tente de définir une instance d'un objet à null. L'objet n'est pas correctement définie à null en raison de collecte des ordures automatique. Il ne peut pas être supprimé de cette manière.
Voici un article de Microsoft comparant Java et C#.
De https://msdn.microsoft.com/en-us/library/ms836794.aspx
"Tous les Objets sont des Références
Types de référence sont très similaires à des pointeurs en C++, notamment lors de la définition d'un identificateur à une nouvelle instance de la classe. Mais lors de l'accès à des propriétés ou des méthodes de ce type de référence, utilisez l'opérateur".", qui est similaire à l'accès aux instances de données en C++, qui sont créés sur la pile. Toutes les instances de classe sont créés sur le segment de mémoire à l'aide de l'opérateur new, mais la suppression n'est pas possible, que les deux langues utilisent leurs propres systèmes de collecte des ordures, discuté ci-dessous."