C# 传递参数计算值的构造函数链接
我如何从一个实例化器传递到另一个实例化器?假设我们上这门课。如何从foo(string,string)传递到foo(Uri)C# 传递参数计算值的构造函数链接,c#,C#,我如何从一个实例化器传递到另一个实例化器?假设我们上这门课。如何从foo(string,string)传递到foo(Uri) 对于简单的构造函数链接,可以使用特殊关键字this或base来引用当前或父类的其他构造函数。您可以使用执行构造函数的任何参数作为链接构造函数的参数,并且可以使用任何合法的单个表达式组合它们。这基本上与应用于为函数调用提供的任何其他内联表达式的规则相同,只是应避免使用类的任何成员(因为尚未构造该类),并将自己限制为常量和传递参数: public foo (Uri someU
对于简单的构造函数链接,可以使用特殊关键字
this
或base
来引用当前或父类的其他构造函数。您可以使用执行构造函数的任何参数作为链接构造函数的参数,并且可以使用任何合法的单个表达式组合它们。这基本上与应用于为函数调用提供的任何其他内联表达式的规则相同,只是应避免使用类的任何成员(因为尚未构造该类),并将自己限制为常量和传递参数:
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;
}
您还可以执行以下操作:
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;
}
}
由于在传递字符串之前要处理它们,因此可以提取到一个通用方法。比如说
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
属性的值 投票重新开放。重复文章中的答案是正确的,但更倾向于传递给后续构造函数的“简单”参数。OP的帖子建议在传递URI之前需要对其进行一些处理。一个更合适的答案是有一个共同的方法,两个构造函数都通过引用调用和传递参数。@keyboardP,同意你的说法。为了更准确地反映这一点,我修改了标题,并投票决定重新开张。(还寻找了这一细微差别的副本,结果是空的)感谢重新开放。有点吹毛求疵,但最好将init
设为私有。我明白了!如果我有更复杂的链接需求,我将在下次设置init。谢谢令人惊叹的。这就是我最后使用的技术。谢谢
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);
}