为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕容708150 2021-12-05 14:46:47
我在这个问题上找到了这个方法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关键字的情况下更改引用。你可以在子方法中做到这一点。
查看完整描述

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会保持不变。它们引用了完全不同的实例。


查看完整回答
反对 回复 2021-12-05
?
小怪兽爱吃肉

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.


查看完整回答
反对 回复 2021-12-05
  • 2 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信