{"id":2634,"date":"2008-06-02T10:05:00","date_gmt":"2008-06-02T10:05:00","guid":{"rendered":"https:\/\/test.simple-talk.com\/uncategorized\/order-of-construction\/"},"modified":"2016-07-28T10:49:18","modified_gmt":"2016-07-28T10:49:18","slug":"order-of-construction","status":"publish","type":"post","link":"https:\/\/www.red-gate.com\/simple-talk\/blogs\/order-of-construction\/","title":{"rendered":"Order of Construction"},"content":{"rendered":"<p class=\"MsoNormal\"><b><\/b>&#160;<\/p>\n<p class=\"MsoNormal\">For me, inheritance is often a headache.&#160; In particular, in what order is everything initialized?&#160; Consider this short C# program. &#160;&#160;It creates an instance of Dog, which derives from Animal.&#160; Both Dog and Animal have an instance constructor, a class initializer (aka a static constructor), an instance variable, and a static variable.&#160; <\/p>\n<pre><\/pre>\n<p class=\"MsoNormal\">There are eight activities here: <\/p>\n<ol>\n<li class=\"MsoNormal\">Dog instance constructor  <\/li>\n<li class=\"MsoNormal\">Dog class constructor  <\/li>\n<li class=\"MsoNormal\">Dog instance variable  <\/li>\n<li class=\"MsoNormal\">Dog static variable  <\/li>\n<li class=\"MsoNormal\">Animal instance constructor  <\/li>\n<li class=\"MsoNormal\">Animal class constructor  <\/li>\n<li class=\"MsoNormal\">Animal instance variable  <\/li>\n<li class=\"MsoNormal\">Animal static variable<\/li>\n<\/ol>\n<p class=\"MsoNormal\">The question is: &#8216;In what order are the eight activities run?&#8217;&#160; Try working it out.&#160; Anyway, the answer is:<\/p>\n<ol>\n<li class=\"MsoNormal\">Dog static variable  <\/li>\n<li class=\"MsoNormal\">Dog class constructor  <\/li>\n<li class=\"MsoNormal\">Dog instance variable  <\/li>\n<li class=\"MsoNormal\">Animal static variable  <\/li>\n<li class=\"MsoNormal\">Animal class constructor  <\/li>\n<li class=\"MsoNormal\">Animal instance variable  <\/li>\n<li class=\"MsoNormal\">Animal&#160;instance constructor  <\/li>\n<li class=\"MsoNormal\">Dog instance constructor<\/li>\n<\/ol>\n<p class=\"MsoNormal\">There are two things I find surprising about this:<\/p>\n<ol>\n<li class=\"MsoNormal\">Why do static constructors run from most derived class to least derived class, i.e. Dog then Animal?  <\/li>\n<li class=\"MsoNormal\">Why do instance variables get initialized before calling the parent&#8217;s instance constructor?<\/li>\n<\/ol>\n<p class=\"MsoNormal\">The answer to question 1 is that Dog&#8217;s class initializer has to be run since we are running Dog&#8217;s instance constructor, but <em>execution of any type&#8217;s class initializer method will not trigger automatic execution of any class initializer methods defined by its base type.&#160; Indeed, why should it?<\/em><i><\/i><\/p>\n<p class=\"MsoNormal\">The answer to question 2 is complicated.&#160; Constructing instance fields in the most derived class first is the only way to ensure that readonly fields are initialized and then not changed.&#160; Check out Eric Lippert&#8217;s blog for a decent explanation: <a href=\"http:\/\/blogs.msdn.com\/ericlippert\/archive\/2008\/02\/15\/why-do-initializers-run-in-the-opposite-order-as-constructors-part-one.aspx\">http:\/\/blogs.msdn.com\/ericlippert\/archive\/2008\/02\/15\/why-do-initializers-run-in-the-opposite-order-as-constructors-part-one.aspx<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#160; For me, inheritance is often a headache.&#160; In particular, in what order is everything initialized?&#160; Consider this short C# program. &#160;&#160;It creates an instance of Dog, which derives from Animal.&#160; Both Dog and Animal have an instance constructor, a class initializer (aka a static constructor), an instance variable, and a static variable.&#160; There are&#8230;&hellip;<\/p>\n","protected":false},"author":95472,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[2],"tags":[],"coauthors":[],"class_list":["post-2634","post","type-post","status-publish","format-standard","hentry","category-blogs"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/2634","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/users\/95472"}],"replies":[{"embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/comments?post=2634"}],"version-history":[{"count":2,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/2634\/revisions"}],"predecessor-version":[{"id":41628,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/2634\/revisions\/41628"}],"wp:attachment":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/media?parent=2634"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/categories?post=2634"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/tags?post=2634"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/coauthors?post=2634"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}