Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

J'Instancie et je retourne un objet dans un fonction, mais je recupere Nothing

6 réponses
Avatar
Kawaman
Bonjour.
J'ai un objet de type TA, et j'ai besoin de pouvoir en faire une copie.
Je passe rapidement sur le fait que je n'utilise pas iCloneable parce
que mon objet herite d'une classe mere implementant deja cette
interface, et je ne peut pas surcharger la methode car elles ont un type
de retour different (la methode heritée renvoie un Object, moi je veut
renvoyer mon type réel)
Donc je fais une methode , a laquelle je donne un parametre optionel, si
par exemple j'ai instancié l'objet avant, et si c'est nothing je crée un
objet. En code ca donne

Public Funtion CloneTo(optional Byref dest As TA=Nothing) As TA
dim retour As TA
if(dest Is Nothing)then
retour = new TA
else
retour = dest
end if

retour.champ=me.champ
return retour
End Function

Ensuite dans mon code principal je veux utiliser un clone
J'ai un objet correct (c'est sur, je le vois dans l'espion) appellé MonObjet
Si je fait

dim var2 As TA
var2=MonObjet.CloneTo

var2 vaut nothing au retour. Alors je comprends pas, parce que j'ai bien
fait un new dans le corps de cloneto, et c'est cet objet que je retourne..
La seule facon avec laquelle j'ai reussi a faire marcher ce code, c'est
de passer en parametre un objet deja instancié.
Expliquez moi s'il vous plait.

6 réponses

Avatar
mitkip
Chez moi l'exemple marche ...

Vous avez essayé de regarder en déboguage ce qui se passe dans la
fonction cloneTo ?
Avatar
Kawaman
Oui, j'ai tracé le code. L'objet est bien crée, tout se passe bien (je
fais une copie en profondeur, mon objet ayant une collection)
au moment de l'instruction return tout est nickel. Mais au retour dans
l'appelant, j'ai nothing. l'affection ne marche pas,
a écrit :
Chez moi l'exemple marche ...

Vous avez essayé de regarder en déboguage ce qui se passe dans la
fonction cloneTo ?



Avatar
Julien
Qu'entendez-vous par "copie en profondeur" ?

Attention aussi au pièges du pas à pas, l'instruction surlignée est
celle qui s'effectuera au pas suivant. Ex :

Si l'instruction surlignée à un instant t est
var2=MonObjet.CloneTo
l'affectation de var2 ne se fera qu'au pas suivant et var2 vaut
toujours nothing au moment t.
Avatar
Kawaman
Julien a écrit :
Par copie en profondeur j'entends que je duplique tous les objets de la
collection d'origine dans une collection de destination
Pour le coup du surlignage de la ligne je sais, mais sans deboguer ca me
donne aussi SystemNullReferenceException si j'utilise l'objet.

J'utilise VS2003 si ca peut etre utile...

Qu'entendez-vous par "copie en profondeur" ?

Attention aussi au pièges du pas à pas, l'instruction surlignée est
celle qui s'effectuera au pas suivant. Ex :

Si l'instruction surlignée à un instant t est
var2=MonObjet.CloneTo
l'affectation de var2 ne se fera qu'au pas suivant et var2 vaut
toujours nothing au moment t.



Avatar
Julien
La variable champ de la classe TA est de quel type ?
Avatar
Kawaman
Julien a écrit :
La variable champ de la classe TA est de quel type ?



J'en ai plusieurs, c'est principalement des integers ou des strings.
Vu vos reponses je pense que vous cherchez sur la piste du fait que mon
clone est mal formé car je copie mal les champs et en fait ce n'est pas
mon objet qui est nothing mais un de ses attributs. Si c'est bien ca
votre intuition, je vous confirme que c'est l'objet en soit qui vaut
nothing.

En fait je me demande surtout si j'ai fait une grosse connerie du genre
la reference est forcement perdue parce que locale et garbage collectée
ou pas. Est ce que vous pensez que ce code peut marcher dans l'esprit.
parce que je n'ai jamais mis mon visual a jour, et j'ai eu un cas tres
bizarre avec des affectacions simples une fois. j'avais 3 integer i, j
et k, et j'ai fait i=j=k=1.
J'avais des problemes a l'execution, et en tracant je me suis rendu
compte qu'une de mes 3 variables n'avait pas été initialisée! et la il
n'y avait pas d'erreur possible. j'ai montré ca a un collegue, on est
arrivé a la meme conclusion : bug du compilateur.
Cette anecdote sert jsute pour dire que ce qui me tourmente c'est de
savoir si c'est une erreur de conception/ comprehension de comment
marche les instances sous .Net ou juste une erreur technique (faute de
frappe, compilo a la rue...)