子使用 Ref 时需要关键字 Ref?

我在这个问题上找到了这个方法


public static void RemoveAt<T>(ref T[] arr, int index)

{

    for (int a = index; a < arr.Length - 1; a++)

    {

        arr[a] = arr[a + 1];

    }

    Array.Resize(ref arr, arr.Length - 1);

}

现在我想知道是否ref需要在嵌套方法中使用它?方法也可能是:


public static void RemoveAt<T>(T[] arr, int index) //ref removed

具有相同的功能?我已经对其进行了测试并且它有效 - 但这意味着您可以在不传递Ref关键字的情况下更改引用。你可以在子方法中做到这一点。


慕容708150
浏览 167回答 2
2回答

子衿沉夜

但这意味着您可以在不传递 Ref 关键字的情况下更改引用。你可以在一个子方法中做到这一点这不是真的。虽然你可以改变参考中的RemoveAt-方法,这一变化不会影响传递给它的参考。您只需将新的(调整大小的)实例扔掉即可。当您想将引用更改为指向某个其他实例时,您的方法应该具有 -ref关键字。在其他关键字中,您的第二个代码也可以这样编写:public static void RemoveAt<T>(arr, int index){&nbsp; &nbsp; for (int a = index; a < arr.Length - 1; a++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; arr[a] = arr[a + 1];&nbsp; &nbsp; }&nbsp; &nbsp; var reference = arr;&nbsp; &nbsp; Array.Resize(ref reference, arr.Length - 1);}虽然reference在调用后当然会改变Array.Resize,但arr会保持不变。它们引用了完全不同的实例。

小怪兽爱吃肉

功能不会一样。Resize可以将引用更改为arr,因此在第一种情况下,您将更改调用方的外部引用,如果没有,ref您将只会更改本地方法引用。参考:var extArr = new object[100];RemoveAt(ref extArr, 10); // The arr variable in this method is now the exact same physical&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 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&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//internally, but the local variable extArr is only copied and not modified// extArr is now a reference to the old, not-resized array.&nbsp;// 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.
打开App,查看更多内容
随时随地看视频慕课网APP