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 回答