使用追加方法扩展数组类(此引用)

本文关键字:引用 数组 追加 方法 扩展 | 更新日期: 2023-09-27 18:31:44

我想扩展System.Array class来做这样的事情:

public static class Extensions
{
    public static void Append( this byte[] dst, byte[] src)
    {
        Array.Resize<byte>(ref dst, dst.Length + src.Length);
        Array.Copy(src, 0, dst, dst.Length - src.Length,src.Length);
        return;
    }
}

但是"这个"是不可能被引用的...返回时,它像开始时一样回头。

使用追加方法扩展数组类(此引用)

如果你的意思是"我可以让扩展方法的第一个参数成为ref参数吗?"那么答案是否定的,你不能。(无论如何,不是在 C# 中。IIRC,你可以在 VB 中 - 但我建议不要这样做。

从 C# 规范的第 10.6.9 节:

扩展方法的第一个参数不能有除 this 以外的修饰符,并且参数类型不能是指针类型。

您必须返回数组:

public static byte[] Append(this byte[] dst, byte[] src)
{
    Array.Resize(ref dst, dst.Length + src.Length);
    Array.Copy(src, 0, dst, dst.Length - src.Length,src.Length);
    return dst;
}

然后称其为:

foo = foo.Append(bar);

不过,在这一点上,你真的想要一个List<byte> - 如果你真的要做一个这样的扩展方法,至少让它成为泛型的:

public static T[] Append<T>(this T[] dst, T[] src)
{
    Array.Resize(ref dst, dst.Length + src.Length);
    Array.Copy(src, 0, dst, dst.Length - src.Length,src.Length);
    return dst;
}

是的,扩展方法的隐式参数不可能具有ref修饰符。 你正在寻找的东西根本不可能;需要使用非扩展方法来获取此行为,或者需要返回新数组而不是修改隐式引用。