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

时间:2013-06-23 22:52:13

标签: 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)
   }
}

3 个答案:

答案 0 :(得分:7)

对于简单的构造函数链接,您可以使用特殊关键字thisbase来引用当前或父类的其他构造函数。您可以将执行构造函数的任何参数用作链式构造函数的参数,并且可以使用任何合法的单个表达式组合它们。这基本上与应用于提供给函数调用的任何其他内联表达式的规则相同,除了您应该避免使用该类的任何成员(因为它尚未构造)并将自己限制为常量和传递参数: / p>

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;
}

答案 1 :(得分: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;
    }
}

答案 2 :(得分: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属性的值,就像在构造函数中设置变量一样。