【问题标题】:Call by reference not working as expected按引用调用未按预期工作
【发布时间】:2014-08-01 02:45:40
【问题描述】:

在微软网站的例子中有以下代码:

class TestRef
{
    static void FillArray(ref int[] arr)
    {
        // Create the array on demand: 
        if (arr == null)
        {
            arr = new int[10];
        }
        // Fill the array:
        arr[0] = 1111;
        arr[4] = 5555;
    }
}

如果我删除if (arr == null)这一行,错误输出将是0 0 0 0 0而不是1 2 3 4 5。为什么?

【问题讨论】:

标签: c# arrays ref


【解决方案1】:

FillArray 函数中,您通过引用传递数组
但是当您删除 if 块时
您重新初始化数组

当您初始化值类型数组时,元素采用值类型的默认值
在这种情况下,int 具有默认值 0

您需要了解 C# 中的按值传递与按引用传递
http://www.programminginterviews.info/2011/05/pass-by-value-versus-reference-in-c.html

还有值类型与引用类型
http://www.albahari.com/valuevsreftypes.aspx

【讨论】:

    【解决方案2】:

    它的发生是因为当您按原样放置代码时,这意味着您将 intArray 传递给该方法,但是当您删除在这种情况下提到的行时,新的 int[] 被分配给变量,该变量将填充默认值 0在你的数组中。

    当您删除条件时,这一行 arr = new int[10]; 正在分配新的 int[]。

    如官方网站所述:-

    数组类型的 ref 参数可能会因为 称呼。例如,可以为数组分配空值或可以 初始化为不同的数组。

    【讨论】:

      【解决方案3】:

      这是因为您正在传递 ref,这意味着您正在更改 main 方法中该变量的指针。

      您正在将其分配给一个新的int[],该int[] 填充了默认值int,即0

      【讨论】:

      • 所以输出将是 1111 0 0 0 5555 0 0 0 0 0
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 2021-05-01
      • 2018-06-28
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多