2 回答
TA贡献1828条经验 获得超3个赞
但这意味着您可以在不传递 Ref 关键字的情况下更改引用。你可以在一个子方法中做到这一点
这不是真的。虽然你可以改变参考中的RemoveAt-方法,这一变化不会影响传递给它的参考。您只需将新的(调整大小的)实例扔掉即可。当您想将引用更改为指向某个其他实例时,您的方法应该具有 -ref关键字。
在其他关键字中,您的第二个代码也可以这样编写:
public static void RemoveAt<T>(arr, int index)
{
for (int a = index; a < arr.Length - 1; a++)
{
arr[a] = arr[a + 1];
}
var reference = arr;
Array.Resize(ref reference, arr.Length - 1);
}
虽然reference在调用后当然会改变Array.Resize,但arr会保持不变。它们引用了完全不同的实例。
TA贡献1852条经验 获得超1个赞
功能不会一样。Resize可以将引用更改为arr,因此在第一种情况下,您将更改调用方的外部引用,如果没有,ref您将只会更改本地方法引用。
参考:
var extArr = new object[100];
RemoveAt(ref extArr, 10); // The arr variable in this method is now the exact same physical
// variable as extArr.
// extArr is now a completely valid reference to the resized array, business as usual.
没有:
var extArr = new object[100];
RemoveAt(extArr , 10); // The copy of the reference (arr) is updated in this method
//internally, but the local variable extArr is only copied and not modified
// extArr is now a reference to the old, not-resized array.
// Note that the element is still "removed", overwritten in the for loop,
// but the resized copy of the array is lost and has no references to it.
- 2 回答
- 0 关注
- 166 浏览
添加回答
举报