Les objets de passage et une liste des objets par référence en C#
J'ai un délégué qui modifie un objet. Je passe d'un objet à la délégation à partir d'un appel de méthode, mais la méthode d'appel ne permet pas de détecter ces changements. Le même code fonctionne si je passe un List
que l'objet.
Je pensais que tous les objets sont passés par référence, donc toutes les modifications seront reflétées dans l'appel de la méthode. Est-ce exact?
Je peux modifier mon code pour passer un ref
objet du délégué. Mais je me demande pourquoi cela est nécessaire. Ou est-il?
public class Binder
{
protected delegate int MyBinder<T>(object reader, T myObject);
public void BindIt<T>(object reader, T myObject)
{
//m_binders is a hashtable of binder objects
MyBinder<T> binder = m_binders["test"] as MyBinder<T>;
int i = binder(reader, myObject);
}
}
public class MyObjectBinder
{
public MyObjectBinder()
{
m_delegates["test"] = new MyBinder<MyObject>(BindMyObject);
}
private int BindMyObject(object reader, MyObject obj)
{
obj = new MyObject
{
//update properties
};
return 1;
}
}
///calling method in some other class
public void CallingMethod()
{
MyObject obj = new MyObject();
MyObjectBinder binder = new MyObjectBinder();
binder.BindIt(myReader, obj); //don't worry about myReader
//obj should show reflected changes
}
Mise à jour:
Je suis en train de passer les objets par ref
au délégué que je suis de l'instanciation d'un objet à l'intérieur de BindMyObject
.
protected delegate int MyBinder<T>(object reader, ref T myObject);
- Je me rends compte que vous essayez de masquer les noms d'origine, ici, mais vous avez à nettoyer cette.
MyBinder
à l'intérieur deCallingMethod
n'est pas défini,MyObjectBinder
n'est pas utilisé... sont-ils les mêmes? Je peux seulement essayer de prendre, et je ne veux pas le faire...
Vous devez vous connecter pour publier un commentaire.
Les objets ne sont pas passés par référence. Les objets ne sont pas transmis à tous.
Par défaut, la valeur de l'argument est passé par valeur - si cette valeur est une valeur de type valeur ou une référence. Si un objet est modifié par l'intermédiaire de cette référence, alors que le changement sera visible par le code appelant ainsi.
Dans le code que vous avez manifesté à l'origine, il n'y a pas de raison d'utiliser
ref
. Leref
mot-clé est utilisé lorsque vous voulez une méthode qui modifie la valeur d'une paramètre (par exemple, pour faire référence à un autre objet entièrement) et ont de ce changement visible pour l'appelant.Maintenant, dans le code que vous avez indiqué (à l'origine), vous avez seulement:
Voulez-vous dire un code comme ceci:
ou un code comme ceci:
? Si c'est le dernier, alors vous n'avez pas besoin
ref
. Si c'est l'ancien, alors vous ne besoinref
parce que vous changez le paramètre lui-même, de ne pas apporter des modifications à l'objet que la valeur se réfère. En fait, si vous êtes juste réglage de la valeur deobj
sans jamais le lire, vous devez utiliserout
au lieu deref
.Si vous pouvez montrer un court mais complète programme qui démontre votre problème, il va être beaucoup plus facile d'expliquer ce qu'il se passe.
Il est difficile de faire ce sujet de la justice, en quelques paragraphes, donc j'ai une article complet à ce sujet, qui nous l'espérons rendre les choses plus évidentes.