title: struct with string member? Invalid default instance acceptable?
body: <p>Is this a good candidate for a struct?</p>
  
  <p>Consider this immutable struct example where the constructor validates input and stores the validated data as a single "routing code":</p>
  
  <pre class="lang-cs prettyprint-override"><code>struct RoutingCode
  {
    private readonly string routingCode;
  
    RoutingCode(string prefix, string service, string sender)
    {
      // Validate prefix, service, sender strings
      // ...
  
      if (isInvalid) throw ArgumentException();
  
      // 
      this.routingCode = prefix + service + sender;
    }
  
    // Gets the validated routing code.
    public string Routing
    {
      return this.routingCode;
    }
  
    public int RoutingLength
    {
      return this.routingCode.Length;
    }
  }
  </code></pre>
  
  <p>This simplified example appears to me to be a good candidate for using a <code>struct</code> instead of a <code>class</code>:</p>
  
  <ul>
  <li>It is immutable.</li>
  <li>It represents a singular value.</li>
  <li>The instance size is small.</li>
  </ul>
  
  <p><strong>The problem</strong> is that all structs have an implicit default constructor. In this example, the default constructor <code>RoutingCode()</code> would instantiate an object where the <code>Routing</code> property returns <code>null</code>&mdash;which is an invalid routing code. This is a different from other structs such as <code>Point</code> or <code>BigInteger</code> where the backing fields contain a very logical and valid "zero" for default instances.</p>
  
  <p>In addition to not ensuring a valid routing code, the <code>RoutingLength</code> property throws a <code>NullReferenceException</code> if called on a default instance.</p>
  
  <p>What are the arguments for keeping this a <code>struct</code> versus making it a <code>class</code>?</p>