2.2 引用类型参数的按值传递

  当传递的参数是引用类型的时候,传递和操作的是指向对象的引用(看到这里,有些朋友会觉得此时不是传递引用吗?怎么还是按值传递了?对于这个疑惑,此时确实是按值传递,此时传递的对象的地址,传递地址本身也是传递这个地址的值,所以此时仍然是按值传递的),此时方法的操作会改变原来的对象。对于这点可能看文字描述会比较难理解下面结合代码和分析图来帮助大家理解下:

class Program
    {
        static void Main(string[] args)
        {
            // 2. 引用类型按值传递情况
            RefClass refClass = new RefClass();
            AddRef(refClass);
            Console.WriteLine(refClass.addnum);
        }  
         // 2. 引用类型按值传递情况
        private static void AddRef(RefClass addnumRef)
        {
            addnumRef.addnum += 1;
            Console.WriteLine(addnumRef.addnum);
        }
}
class RefClass
    {
        public int addnum=1;
    }

  运行结果为:

  为什么此时传递引用会修改原来实参中的值呢?对于这点我们还是参数在内存中分布图来解释下:

  2.3 .String引用类型的按值传递的特殊情况

  对于String类型同样是引用类型,然而对于string类型的按值传递时,此时引用类型的按值传递却不会修改实参的值,可能很多朋友对于这点很困惑,下面具体看看下面的代码:

class Program
    {
        static void Main(string[] args)
        {
              // 3. String引用类型的按值传递的特殊情况
            string str = "old string";
            ChangeStr(str);
            Console.WriteLine(str);
                              
        }
                          
         // 3. String引用类型的按值传递的特殊情况
        private static void ChangeStr(string oldStr)
        {
            oldStr = "New string";
            Console.WriteLine(oldStr);
        }
}

  运行结果为: