title: Chain-overloading constructors?
body: <p>I'm trying to build a class which will initalise its self either by passing in a reference to a record in a database (with the intention that a query will be run against the database and the returned values for the objects properties will be set therein), or by specifying the values "by hand" - this no database call is required.</p>
  
  <p>I've looked at a couple textbooks to discover the "Best-practice" for this functionality and sadly I've come up short.</p>
  
  <p>I've written a couple sample console apps reflecting what I believe to be the two most probable solutions, but I've no Idea which is the best to implement properly?</p>
  
  <p>Sample App #1 uses what most books tell me is the "preferred" way but most examples given alongside those claims do not really fit the context of my situation.  I'm worried in here that the flow is not as readable as App #2.</p>
  
  <pre><code>using System;
  
  namespace TestApp
  {
      public class Program
      {
          public static void Main(string[] args)
          {
              var one = new OverloadedClassTester();
              var two = new OverloadedClassTester(42);
              var three = new OverloadedClassTester(69, "Mike", 24);
  
              Console.WriteLine("{0}{1}{2}", one, two, three);
  
              Console.ReadKey();
          }        
      }
  
      public class OverloadedClassTester
      {
          public int ID { get; set; }
          public string Name { get; set; }
          public int age { get; set; }
  
          public OverloadedClassTester() : this(0) { }
  
          public OverloadedClassTester (int _ID) : this (_ID, "", 0)
          {
              this.age = 14;  // Pretend that this was sourced from a database
              this.Name = "Steve"; // Pretend that this was sourced from a database
          }
  
          public OverloadedClassTester(int _ID, string _Name, int _age)
          {
              this.ID = _ID;
              this.Name = _Name;
              this.age = _age;
          }
  
          public override string ToString()
          {
              return String.Format("ID: {0}\nName: {1}\nAge: {2}\n\n", this.ID, this.Name, this.age);
          }
      }
  }
  </code></pre>
  
  <p>This Sample (App #2) "appears" more readable - in that I think it's easier to see the flow of operation.  However it does appear efficient in terms of characters saved :p.  Also, is it not dangerous that it calls a method of the object before it's fully initialised, or is this not a concern?</p>
  
  <pre><code>using System;
  
  namespace TestApp
  {
      public class Program
      {
          public static void Main(string[] args)
          {
              var one = new OverloadedClassTester();
              var two = new OverloadedClassTester(42);
              var three = new OverloadedClassTester(69, "Mike", 24);
  
              Console.WriteLine("{0}{1}{2}", one, two, three);
  
              Console.ReadKey();
          }        
      }
  
      public class OverloadedClassTester
      {
          public int ID { get; set; }
          public string Name { get; set; }
          public int age { get; set; }
  
          public OverloadedClassTester()
          {
              initialise(0, "", 21); // use defaults.
          }
  
          public OverloadedClassTester (int _ID)
          {
              var age = 14;  // Pretend that this was sourced from a database (from _ID)
              var Name = "Steve"; // Pretend that this was sourced from a database (from _ID)
  
              initialise(_ID, Name, age);
          }
  
          public OverloadedClassTester(int _ID, string _Name, int _age)
          {
              initialise(_ID, _Name, _age);
          }
  
          public void initialise(int _ID, string _Name, int _age)
          {
              this.ID = _ID;
              this.Name = _Name;
              this.age = _age;
          }
  
          public override string ToString()
          {
              return String.Format("ID: {0}\nName: {1}\nAge: {2}\n\n", this.ID, this.Name, this.age);
          }
      }
  }
  </code></pre>
  
  <p>What is the "correct" way to solve this problem, and why?</p>
  
  <p>Thanks, </p>