C#在另一个函数

时间:2016-01-08 17:45:47

标签: c# arrays string function

我在setValues()函数中覆盖变量'arr [1]'和'test'。

arr [1]更改为“BBB”

但测试不会更改为'222'

  

输出:BBB111

但它应该是BBB222

为什么字符串测试没有更新?

public class Program
    {
        static void Main(string[] args)
        {
            string[] arr = new string[10];

            arr[1] = "AAA";
            string test = "111";

            setValues(arr, test);

            int exit = -1;
            while (exit < 0)
            {

                for (int i = 0; i < arr.Length; i++)
                {
                    if (!String.IsNullOrEmpty(arr[i]))
                    {
                        Console.WriteLine(arr[i] + test);
                    }
                }
            }
        }

        private static void setValues(string[] arr, string test)
        {
            arr[1] = "BBB";
            test = "222";
        }
    }

5 个答案:

答案 0 :(得分:5)

您需要通过引用传递该字符串才能在方法中修改它,您可以通过添加ref关键字来执行此操作:

public class Program
    {
        static void Main(string[] args)
        {
            string[] arr = new string[10];

            arr[1] = "AAA";
            string test = "111";

            setValues(arr, ref test);

            int exit = -1;
            while (exit < 0)
            {

                for (int i = 0; i < arr.Length; i++)
                {
                    if (!String.IsNullOrEmpty(arr[i]))
                    {
                        Console.WriteLine(arr[i] + test);
                    }
                }
            }
        }

        private static void setValues(string[] arr, ref string test)
        {
            arr[1] = "BBB";
            test = "222";
        }
    }

答案 1 :(得分:2)

您只是在test功能中更改setValues的本地引用。您需要通过引用(ref

传递此变量
private static void setValues(string[] arr, ref string test)
{
    arr[1] = "BBB";
    test = "222";
}

然后这样称呼:

setValues(arr, ref test);

答案 2 :(得分:0)

这是因为test方法中的setValues参数未标记为ref,因此仅在方法内部进行更改,且值不会超出范围。< / p>

答案 3 :(得分:0)

因为作为对象的数组是通过引用传递的,而字符串是通过值传递的。 因此,函数setValues()更新测试的本地副本,对调用者不可见,同时更新string [] arr的ONLY实例,对调用者而不是对被调用者可见。

答案 4 :(得分:0)

原因是可变范围。 SetValues()方法中引用的变量与Main中引用的变量不同。 根据课程的需要,有两种方法可以解决这个问题:

  1. 如其他答案中所述,在SetValues方法中通过引用传递值(这样可以按原样保留代码):
  2. public class Program
        {
            static string[] arr = new string[10];
            static string test = "111";
    
            static void Main(string[] args)
            {
                arr[1] = "AAA";
    
    1. 将变量声明移到Main主体之外(这会将变量的范围更改为类级变量,这些变量将它们范围限定为整个类,并且可能允许从其他类访问它们):
    2. SetValues(arr, ref test);
           

      然后通过引用调用它:

           

      Activator.CreateInstance(Type)