当引用变量可以通过引用传递时:

    class Example
    {
        public string str="Demo";

        public int[] intValues={1,3,4,5};

       public static void StrPassing(string someStr)
        {
            string otherStr="Changed!";
            someStr=otherStr;
        }

        public static void NumPassing(int[] a)
        {
            a[2] = 115;
        }

    }


       static void Main(string[] args)
        {
            Example ex = new Example();
            Example.StrPassing(ex.str);
            Example.NumPassing(ex.intValues);

            foreach (int i in ex.intValues)
            {
                Console.WriteLine(i);
            }

            Console.WriteLine(ex.str);
            Console.ReadLine();
        }


在传递引用时,intValues[2]的值将更改为115。但是字符串“ str”(演示)的值未更改为“ Changed!”。这是什么原因?将其作为数组通过引用传递,而其他引用类型通过传递
值?

最佳答案

您需要区分更改变量引用哪个对象和更改“对象的内容”。

在此代码中:

public static void StrPassing(string someStr)
{
    string otherStr="Changed!";
    someStr=otherStr;
}


...您正在更改someStr的值。您没有对someStr最初引用的字符串进行任何更改。确实,您不能因为字符串是不可变的。 (如果它是StringBuilder,则可以将长度设置为0,然后附加“已更改!”。)

更改someStr的值无效,因为参数(ex.str)是按值传递的。 (有问题的值是一个引用,但这并不意味着它已通过引用传递。)

现在将其与以下代码进行比较:

public static void NumPassing(int[] a)
{
    a[2] = 115;
}


在这里,您没有更改a的值-您正在更改a引用的数组的内容。

简而言之,除非使用ref / out,否则参数将按值传递-但对于引用类型,该值仅是引用。

我有一个article on parameter passing,它会更详细地介绍所有这些内容。

09-10 01:33
查看更多