将可变参数扩展到另一种方法而无需成本

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