将可变参数扩展到另一种方法而无需成本
Expand variadic arguments to another method without cost
在 C# 中,如何将可变参数列表传递给另一个接受可变参数列表的方法,最好不要花费太多?
例如:
class StringHelper
{
public string Concat(params string[] values)
{
lock (_stringBuilder)
{
Clear();
for (var i = 0; i < values.Length; i++)
_stringBuilder.Append(values[i]);
return _stringBuilder.ToString();
}
}
}
static class StringUtilShared
{
static readonly StringHelper _stringHelper = new StringHelper(256);
public static string Concat(this string str, params string[] values)
{
return _stringHelper.Concat(str, /* pass args here! */);
}
}
您的方法应该接受 IEnumerable<string>
,而不是使用接受数组的方法。由于它们只是 "iterators",因此当您想要传递额外的元素时,无需复制所有元素。
首先,将 Concat
的实际逻辑放在一个接受 IEnumerable<string>
的方法中,并让 Concat
的可变参数重载调用 IEnumerable<string>
重载:
class StringHelper
{
public string Concat(IEnumerable<string> values)
{
lock (_stringBuilder)
{
Clear();
foreach (string value in values)
_stringBuilder.Append(value);
return _stringBuilder.ToString();
}
}
public string Concat(params string[] values) {
return Concat((IEnumerable<string>)values);
}
}
现在,您可以在扩展方法中调用 IEnumerable<string>
重载:
public static string Concat(this string str, params string[] values)
{
return _stringHelper.Concat(values.Prepend(str));
}
在 C# 中,如何将可变参数列表传递给另一个接受可变参数列表的方法,最好不要花费太多?
例如:
class StringHelper
{
public string Concat(params string[] values)
{
lock (_stringBuilder)
{
Clear();
for (var i = 0; i < values.Length; i++)
_stringBuilder.Append(values[i]);
return _stringBuilder.ToString();
}
}
}
static class StringUtilShared
{
static readonly StringHelper _stringHelper = new StringHelper(256);
public static string Concat(this string str, params string[] values)
{
return _stringHelper.Concat(str, /* pass args here! */);
}
}
您的方法应该接受 IEnumerable<string>
,而不是使用接受数组的方法。由于它们只是 "iterators",因此当您想要传递额外的元素时,无需复制所有元素。
首先,将 Concat
的实际逻辑放在一个接受 IEnumerable<string>
的方法中,并让 Concat
的可变参数重载调用 IEnumerable<string>
重载:
class StringHelper
{
public string Concat(IEnumerable<string> values)
{
lock (_stringBuilder)
{
Clear();
foreach (string value in values)
_stringBuilder.Append(value);
return _stringBuilder.ToString();
}
}
public string Concat(params string[] values) {
return Concat((IEnumerable<string>)values);
}
}
现在,您可以在扩展方法中调用 IEnumerable<string>
重载:
public static string Concat(this string str, params string[] values)
{
return _stringHelper.Concat(values.Prepend(str));
}