GNT sans publicité, site mobile, fonctionnalitées exclusives...

Quelle est la nuance entre ces deux codes

Le
Mick
Bonjour,
J'aimerais avoir votre avis sur la question suivante :
Les deux codes suivants font-ils la même chose ? Plus concretement, est
qu'au finish, on arrive au même point.

NUMERO 1
TempTable = new DataTable();
TempTable = new DataTable();

NUMERO 2
TempTable = new DataTable();
TempTable= null;
TempTable = new DataTable();

Dans mon, appli, j'instancie la DataTable à chaque fois, avant de m'en
servir de variable de stockage pour une function en relation avec un serveur
Bloomberg. Cependant, il s'avère que si je ne met pas ma DataTable à null
avant de la réinstantier à nouveau (en gros, je fais du requetage vers
Bloomberg à plusieurs reprise dans un For, tout en réinstantiant la
DataTable), la function freeze et ne retourne rien. En placant un timeout à
15 minutes, la fonction prend fin et l'appli redemarre. Si je rajoute la
ligne du "null", la fonction ne freeze pas. Il s'avère que la Faq Bloomberg
explique ce details.

Mais je suis assez perplexe sur la nuance entre les deux codes.
Donc si un esprit éclairé pouvait m'aiguiller ^^

Merci d'avance.
Lire les 15 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Ambassadeur Kosh
Le #12066851
moi j'en dis que les deux vallent la meme chose :)


Bonjour,
J'aimerais avoir votre avis sur la question suivante :
Les deux codes suivants font-ils la même chose ? Plus concretement, est
qu'au finish, on arrive au même point.

NUMERO 1
TempTable = new DataTable();
TempTable = new DataTable();

NUMERO 2
TempTable = new DataTable();
TempTable= null;
TempTable = new DataTable();


Patrick Philippot
Le #12066831
Mick wrote:
Les deux codes suivants font-ils la même chose ? Plus concretement,
est qu'au finish, on arrive au même point.

NUMERO 1
TempTable = new DataTable();
TempTable = new DataTable();

NUMERO 2
TempTable = new DataTable();
TempTable= null;
TempTable = new DataTable();



Bonjour,

Si l'on considère uniquement le code linéaire que vous présentez, il n'y
a sémantiquement aucune différence et l'affectation de null à TempTable
est, AMHA, inutile. La deuxième affectation écrase la référence
existante qui devient inaccessible et donc candidate à un futur garbage
collect.

Cependant, vous indiquez que cette opération se réalise dans une boucle
qui manipule la DataTable de manière plus complexe. Serait-il possible
de voir un code plus proche de ce que vous faites réellement?

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Patrick Philippot
Le #12066821
Une remarque cependant...

Quand vous n'affectez pas null, l'objet précédent ne peut pas être
inscrit comme candidat à la destruction par le GC car la variable n'est
pas sortie du scope. Il n'y a donc pas de moyen de décider de la
destruction de la DataTable précédente. La destruction effective de tous
les objets instanciés ne pourra être envisagée qu'en sortie de boucle.

Si vos DataTables sont gourmandes en mémoire et si le nombre de boucles
est important, vous asphyxiez donc votre application au bout de quelques
passes.

Donc si les 2 codes sont sémantiquement équivalents, la deuxième version
aide le GC à faire son travail plus efficacement et plus tôt.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Patrick Philippot
Le #12066811
Patrick Philippot wrote:
Si vos DataTables sont gourmandes en mémoire et si le nombre de
boucles est important, vous asphyxiez donc votre application au bout
de quelques passes.



Si ma remarque est correcte, un appel à TempTable.Clear (sans affecter
la valeur null à la variable) avant la nouvelle instanciation devrait
sinon faire disparaître le problème, du moins retarder son apparition
car la quantité de mémoire utilisée par la DataTable serait libérée
immédiatement au lieu d'attendre la destruction de l'objet.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Zazar
Le #12066801
Bonjour

Une remarque cependant...

Quand vous n'affectez pas null, l'objet précédent ne peut pas être
inscrit comme candidat à la destruction par le GC car la variable n'est
pas sortie du scope.



La variable existe encore, mais l'objet DataSet n'est plus référencé et
c'est ça qui compte. Si jamais le GC se déclenchait alors que la variable
existe, il se rendrait compte que l'objet DataSet peut être détruit.

--

Zazar
Publicité
Suivre les réponses
Poster une réponse
Anonyme