【问题标题】:My C# functions seems to be acting as if I am passing by ref, why does it do this? [duplicate]我的 C# 函数似乎在通过 ref 传递,为什么它会这样做? [复制]
【发布时间】:2020-04-12 02:07:19
【问题描述】:

在查看一些布尔数组和整数后,我有一个返回 true 或 false 的布尔值。

if (CheckForRoute(VertWallAbove, HoriWallLeft, NewWallX, NewWallY, NewWallHor))

在此函数期间,来自 HoriWallLeft 的参数将其 value[0,0] 设置为 true(在此之前,数组中的每个值都是 false,我已经检查过断点是否发生这种情况)。退出函数后,HoriWallLeft[0,0] 的值立即为真,我原以为只有在我经过 ref 时才会发生这种情况。

编辑: 这是我的意思的一个例子

static void Main(string[] args)
{
    bool[] Test = new bool[] { false, false, false, false };
    ExampleFunction(Test);
    if(Test[0])
    {
        Console.WriteLine("A");
    }
    else
    {
    Console.WriteLine("B");
    }
    Console.ReadLine();
}
static bool ExampleFunction(bool[] TestArray)
{
    TestArray[0] = true;
    return true;
}

我希望这会输出 B,但它会输出 A

【问题讨论】:

  • 所以,你基本上是在传递一个指向布尔数组的指针。这就是您可以修改单个元素的原因。
  • 数组是引用类型。对一个引用执行任何操作都会反映在对同一数组实例的所有其他引用中。
  • 数组是一种引用类型,因此对 TestArray[0] 的修改实际上应用于它所引用的数组对象。
  • @LittleSweetSeas - 您的评论具有误导性。除非使用 ref 关键字,否则 bool[] 不会通过引用传递。在示例代码中,它是按值传递的。

标签: c# function ref


【解决方案1】:

这是正确的,您正在将此数组的引用传递给函数。 没有创建数组的副本。

如果你想创建一个副本,你可以调用

ExampleFunction(Test.ToArray());

【讨论】:

  • 如果是多维数组这个会改变吗?
  • 不,只有使用 ExampleFunction(bool b1, bool b2, bool b3) 才会改变。 Bool 是值类型,任何数组都是引用类型。您的 Test 变量已经是对 Array 的引用;不是数组本身。在定义只读 bool[] 数组时了解这一点很重要。这里也只有引用是只读的,而不是数组的值。
猜你喜欢
  • 2011-06-21
  • 2011-11-11
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
相关资源
最近更新 更多