使用追加方法扩展数组类(此引用)
本文关键字:引用 数组 追加 方法 扩展 | 更新日期: 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
修饰符。 你正在寻找的东西根本不可能;需要使用非扩展方法来获取此行为,或者需要返回新数组而不是修改隐式引用。