2016-05-26 6 views
0

私は別のオブジェクトのメソッドにパラメータを通じて周りの異なる接続文字列を渡しています:文字列パラメータをスーパータイプに昇格する必要がありますか?

public ConnectOrDie(string connectionString) 
{ 
      if (string.IsNullOrEmpty(connectionString)) 
      { 
       this._logger.ConfigurationNotFound(); 
       throw new ConfigurationErrorsException("Configuration string is not found."); 
      } 

} 

string.IsNullOrEmptyにメソッドが呼び出されるたびにチェックする必要がDRY元本をサポートしていないために、それは次のようになりそのためのタイプを作成し、集中化された場所でその妥当性をチェックするための良いプラクティスと考えられていますか?

public class ConnectionString 
{ 
    private string _value; 
    public ConnectionString(string value) 
    { 
    if(string.IsNullOrEmpty(value) throw; 
    _value = value; 
    } 
} 
+0

、私は 'セマンティックTypes'、ある唯一の問題に非常に有利ですC#では構造体用のボイラープレートコードをたくさん書かなければなりませんでした(これは一般的に 'Semantic Types'に最適です)。 –

+0

"構造体用のボイラープレートコード" ---どうか説明できますか? –

+0

'Equals'、' GetHashCode'をオーバーライドします。 'IEquatable'などを実装します。この場合は' class'でも[Structural Typing](https://en.wikipedia.org/wiki/Structural_type_system)が必要です。 –

答えて

0

このような何か:あなたはこのようなあなたのメソッドを呼び出すことができます

struct ConnectionString : IEquatable<ConnectionString> 
{ 
    readonly string _value; 

    public string Value { get { return _value; } } 

    public ConnectionString(string value) 
    { 
     if (string.IsNullOrEmpty(value)) 
     { 
      throw new ArgumentNullException(value); 
     } 

     _value = value; 
    } 

    public override bool Equals(object obj) 
    { 
     return base.Equals(obj is ConnectionString && Equals((ConnectionString)obj)); 
    } 

    public bool Equals(ConnectionString other) 
    { 
     return this == other; 
    } 

    public static bool operator ==(ConnectionString left, ConnectionString right) 
    { 
     return left._value == right._value; 
    } 

    public static bool operator !=(ConnectionString left, ConnectionString right) 
    { 
     return left._value != right._value; 
    } 

    public override int GetHashCode() 
    { 
     return _value.GetHashCode(); 
    } 

    public override string ToString() 
    { 
     return _value; 
    } 

    public static implicit operator ConnectionString(string value) 
    { 
     return new ConnectionString(value); 
    } 

    public static explicit operator string(ConnectionString value) 
    { 
     return value._value; 
    } 
} 

:私はそう思いConnectOrDie("conn");

+0

なぜクラスの代わりに構造体を使用しましたか? –

+0

余分な割り当てを避けるためです。 –

+0

ありがとうございます。あなたはGuidで同じことをすることをお勧めしますか? –

関連する問題