C#覆盖另一个函数中的字符串和字符串[]

本文关键字:字符串 覆盖 另一个 函数 | 更新日期: 2023-09-27 18:29:29

我覆盖setValues()函数中的变量"arr[1]"answers"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";
        }
    }

C#覆盖另一个函数中的字符串和字符串[]

您需要通过引用传递该字符串才能在方法中修改它,您可以通过添加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";
        }
    }

您只是在setValues函数中更改对test的本地引用。您需要通过引用(ref)传递此变量

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

然后这样称呼它:

setValues(arr, ref test);

这是因为setValues方法中的test prameter没有标记为ref,所以它只在方法内部更改,而值不会在方法外部。

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

Paolo

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

  1. 如其他答案中所述,在SetValues方法中通过引用传递值(这将保持代码的原样):
private static void setValues(string[] arr, ref string test)
{
    arr[1] = "BBB";
    test = "222";
}
  1. 将变量声明移到Main主体之外(这将变量的作用域更改为Class级别的变量,这将变量作用域扩展到整个类,并可能允许从其他类访问它们):
public class Program
    {
        static string[] arr = new string[10];
        static string test = "111";
        static void Main(string[] args)
        {
            arr[1] = "AAA";

然后也通过引用调用它:

SetValues(arr, ref test);