octobre
2011
Vous avez surement déjà vu ou déclenché des exceptions depuis un constructeur .NET.
Mais connaissez-vous vraiment le comportement sous-jacent lorsque cela arrive ?
Soit ce code :
public class TestCtor { /// <summary> /// Initializes a new instance of the <see cref="T:TestCtor"/> class. /// </summary> public TestCtor() { throw new Exception("test"); } /// <summary> /// Finalizes an instance of the <see cref="T:TestCtor"/> class. /// </summary> ~TestCtor() { Console.WriteLine("Object is alive ! Hashcode : {0}", this.GetHashCode()); } }
et son utilisation :
/// <summary> /// Defines the program entry point. /// </summary> /// <param name="args">An array of <see cref="T:System.String"/> containing command line parameters.</param> private static void Main(string[] args) { TestCtor instance = null; try { instance = new TestCtor(); } catch (Exception) { } Console.WriteLine("instance is null ? {0}", instance == null); GC.Collect(); Console.ReadLine(); }
Question : D’après vous quel est le comportement affiché ?
1°) “Instance is null = true” et fin du programme
2°) “Instance is null = true “et “Object is alive ! HashCode : ”
3°) “Instance is null = false” et “Object is alive ! HashCode" : “
tic, tac, tic, tac, tic, tac …
La bonne réponse est la numéro 2.
En effet lors du passage dans le constructeur, l’instance de la classe TestCtor est déjà créé et référencé par le runtime. L’exception déclenché lors de l’exécution du constructeur ne fait qu’empêcher que le pointeur sur l’instance ne soit transmis à la variable “instance”. Ce qui veux dire que nous avons, à ce moment, un objet qui n’est référencé à aucun endroit dans le programme. Le Garbage Collector peut donc nettoyer cet objet, c’est ce qui est mis en avant dans le destructeur.
A noter qu’il n’est pas interdit ou déconseillé de déclencher des exceptions depuis un constructeur, il faut juste être au courant de ce comportement pour éviter par exemple de laisser trainer un objet à moitié instancié.
Archives
- juillet 2012
- mars 2012
- février 2012
- novembre 2011
- octobre 2011
- mars 2011
- novembre 2010
- octobre 2010
- septembre 2010
- août 2010
- avril 2010
- février 2010
- janvier 2010
- novembre 2009
- octobre 2009
- septembre 2009
- juin 2009
- mai 2009
- avril 2009
- mars 2009
- février 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juin 2008
- mai 2008
- avril 2008
- février 2008
- mai 2007
- avril 2007
- mars 2007
- février 2007
- janvier 2007