构造函数链接传递参数的计算值

Bil*_*ble 5 c#

我怎样才能从一个实例化器传递到另一个实例器?假设我们有这门课.如何从foo(字符串,字符串)传递给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)
   }
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*eld 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.
}
Run Code Online (Sandbox Code Playgroud)

只要您需要执行的处理可以在单值表达式中完成,这将起作用.例如,如果您需要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;
}
Run Code Online (Sandbox Code Playgroud)


小智 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;
    }
}
Run Code Online (Sandbox Code Playgroud)