6

あるインスタンシエーターから別のインスタンシエーターにパススルーするにはどうすればよいですか? このクラスがあるとします。foo(string, string) から foo(Uri) に渡すにはどうすればよいですか?

public foo
{
   string path { get; private set; }
   string query { get; private set; }

   public foo (Uri someUrl)
   {
      // ... do stuff here
   }

   public foo (string path, string query)
   {
      Uri someUrl = new Uri(String.Concat(path, query);

      // ... do stuff here to pass thru to foo(someUrl)
   }
}
4

3 に答える 3

7

単純なコンストラクター チェーンの場合、特別なキーワードを使用するthisbase、現在または親クラスの他のコンストラクターを参照できます。実行中のコンストラクターの任意のパラメーターを連鎖コンストラクターのパラメーターとして使用することが許可されており、有効な単一の式を使用してそれらを組み合わせることができます。これは基本的に、関数呼び出しに提供される他のインライン式に適用される規則と同じですが、(まだ構築されていないため) クラスのメンバーの使用を避け、定数とパススルー パラメーターに制限する必要があります。

public foo (Uri someUrl)
{
     this.url = someUrl;
}

public foo (string path, string query)
    : this(new Uri(String.Concat(path, query)))
{
    // this.url is now set and available.
}

これは、実行する必要がある処理が単一の値の式で実行できる限り機能します。たとえば、他のコンストラクターに送信される前に で何か他のことを行うUri必要がある場合、または複雑な if/then ロジックが必要な場合、この手法を回避することはできません。別の方法は、コードを初期化メソッドにリファクタリングすることです。

public foo (Uri someUrl)
{
    this.init(someUrl);
}

public foo (string path, string query)
{
    var url = String.Concat(path, query);
    url = url.Replace("http://", "https://");

    this.init(url);
}

private void init (Uri someUrl)
{
     this.url = someUrl;
}
于 2013-06-24T03:38:59.363 に答える
4

次のようなこともできます。

class Frob
{
    public Frob (Uri uri)
    {

    }

    public Frob(string path, string query)
        : this(TidyUpUri(path, query))
    {

    }

    private static Uri TidyUpUri(string path, string query)
    {
        var uri = new Uri(string.Concat(path, query));

        // etc.

        return uri;
    }
}
于 2013-06-24T03:49:00.547 に答える
2

文字列を渡す前に処理しているので、共通のメソッドに抽出できます。例えば

private void ProcessUri(ref Uri theUri)
{
   //...do your URI stuff here
}

public foo (Uri someUrl)
{
   ProcessUri(ref someUrl);
}

public foo (string path, string query)
{
   Uri someUrl = new Uri(String.Concat(path, query));

   // ... do stuff here to pass then call ProcessUri
   ProcessUri(ref someUrl);
}

で物を渡す利点は、変数がコンストラクター内で設定された場合と同じように、プロパティrefの値を設定できることです。readonly

于 2013-06-24T08:02:51.627 に答える