【问题标题】:How to pass an array between methods?如何在方法之间传递数组?
【发布时间】:2020-06-18 10:36:03
【问题描述】:

我正在阅读一本书并尝试“挑战”。在这里,我遇到了在方法之间正确返回和传递数组的问题。返回数组时出现问题,尤其是从第二种方法返回,然后将其传递给第三种方法进行打印。

我在概念层面上理解堆栈、堆、值和引用,但有些东西显然是 错误的。 每种方法似乎都可以正常工作。

using System;

namespace PracticeArray
{
    class Program
    {
        static int[] GenerateNumbers()
        {
            Console.WriteLine("Enter a number to generate array from:");
            string input = Console.ReadLine();
            int inputNumber = Convert.ToInt32(input);

            int[] generatedArray = new int[inputNumber];
            for (int i = 0; i < generatedArray.Length; i++)
            {
                generatedArray[i] = i;
            }

            return generatedArray;
        }

        static int[] Reverse(int[] arrayToReverse)
        {
            int count = arrayToReverse.Length;

            int[] arrayToReturn = new int[count];

            count--;

            for (int i = 0; i < arrayToReturn.Length; i++)
            {
                arrayToReturn[i] = arrayToReverse[count--];

            }

           return arrayToReturn;
        }

        static void PrintNumbers(int[] numbersToPrint)
        {

            foreach (int singleNumber in numbersToPrint)
            {
                Console.Write(singleNumber + ", ");
            }
        }

        static void Main(string[] args)
        {

            int[] numbers = GenerateNumbers();
            Reverse(numbers);
            PrintNumbers(numbers);

        }
    }
}

【问题讨论】:

  • return 不会覆盖输入参数。试试int[] newNumbers = Reverse(numbers); PrintNumbers(newNumbers);
  • 嗨!你只需要分配回 numbers 变量! numbers = Reverse(numbers);
  • 使用Reverse(numbers);,相当于将新阵列丢在地板上。您需要以某种方式接收它(例如,将其分配给一个变量,或将其直接传递给PrintNumbers)。这与数组无关,更多的是与从方法返回值的基础有关。
  • 为什么不使用Array.Reverse

标签: c# arrays parameter-passing return-value


【解决方案1】:

问题

你返回的数组是一个新数组:

查看您的 Reverse 函数。您创建一个名为 arrayToReturn 的新数组并返回该数组。您也永远不会修改原始输入数组arrayToReverse

        static int[] Reverse(int[] arrayToReverse) // this input array is never modified
        {
            int count = arrayToReverse.Length;
            // ...
            arrayToReturn = new int[count]; // Here is the new array
            // ...
            return arrayToReturn; // you return the new array
        }

现在看看你在哪里调用了Reverse,你传入了一些生成的数字,但是你忽略了函数的返回值,所以你永远不会知道新数组是什么。请记住,我们在上面已经确定您不要修改输入数组的元素。所以numbers 将保持不变。

        static void Main(string[] args)
        {
            int[] numbers = GenerateNumbers();
            Reverse(numbers); // you ignored the return value of `Reverse`
            PrintNumbers(numbers); // These are the original unreversed numbers
        }

修复

选项 #1 - 存储结果的新变量

要解决这个问题,将从Reverse 返回的数组存储在一个变量中并打印这些数字。

        static void Main(string[] args)
        {
            int[] numbers = GenerateNumbers();
            int[] reversedNumbers = Reverse(numbers);
            PrintNumbers(reversedNumbers);
        }

选项 #2 - 重复使用相同的变量来存储结果

在此选项中,您只需丢弃原始数组,方法是获取从Reverse 返回的新反转数字数组并将其分配给numbers 变量。在该赋值之后,numbers 将引用从Reverse 返回的反转数组。原始数组是孤立的并被遗忘 - 最终被垃圾收集。

        static void Main(string[] args)
        {
            int[] numbers = GenerateNumbers();
            // repurpose the `numbers` variable to store the result.
            numbers = Reverse(numbers);
            PrintNumbers(numbers);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    相关资源
    最近更新 更多