值类型和引用类型数据的传递

一、值类型和引用类型数据的传递

引用类型:string 、数组、集合、object类型、自定义类、接口、

值类型:int 、double、char、bool、enum、struct、decimal

1、值类型数据在复制的时候,传递的是值的本身

2、引用类型数据在复制的时候,传递的是这个值的引用(即地址)




1、值类型数据的传递:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 值类型的传递1
{
    class Program
    {
        static void Main(string[] args)
        {
            int num1 = 20;
            int num2 = num1;
            num2 = 40;
            Console.WriteLine("num1的值是: "+num1);
            Console.WriteLine("num2的值是: "+num2);
            Console.ReadKey();
        }
    }
}

运行结果:


内存分析图:


2、引用类型数据的传递1:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 引用类型的传递1
{
    class Program
    {
        static void Main(string[] args)
        {
            Person per1 = new Person();
            per1.Name = "张三";
            Person per2 = per1;
            per2.Name = "李四";
            Console.WriteLine("per1.name的值是: " +per1.Name);
            Console.WriteLine("per2.name的值是: " +per2.Name);
            Console.ReadKey();
        }
    }
    public class Person
    {
        public string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }
}

运行结果:


内存分析:


调试分析:


引用类型的传递2:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 引用数据类型的传递2
{
    class Program
    {
        static void Main(string[] args)
        {
            Person per = new Person();
            per.Name = "张三";
            Test(per);
            Console.WriteLine("per.name的值为: " +per.Name);
            Console.ReadKey();


        }
        public static void Test(Person p)
        {
            Person pp = p;
            pp.Name = "李四";
        }

    }
    public class Person
    {

        public string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

    }
}

运行结果:


内存分析:


3、引用类型的传递字符串的特例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 引用的传递
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "张三";
            string str1 = str;
            Console.WriteLine("str的值为: " + str);
            Console.WriteLine("str1的值为: "+ str1);
            Console.WriteLine("======分割线======");
            str1 = "李四";
            Console.WriteLine("str的值为: "+ str);
            Console.WriteLine("str1的值为: "+ str1);
            Console.WriteLine("======分割线======");
            str1 = str;
            Console.WriteLine("str的值为: "+ str);
            Console.WriteLine("str1的值为:"+ str1);
            Console.WriteLine("======分割线======");
            Console.ReadKey();
        }
    }
}

运行结果:


调试分析:


引用的传递与ref参数的区别:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ref的传递原理
{
    class Program
    {
        static void Main(string[] args)
        {
            int num = 10;
            int rnum = 10;
            Test(num);
            Rtest(ref rnum);
            Console.WriteLine("调用没有使用ref参数的方法后的值为: "+ num);
            Console.WriteLine("调用使用ref参数的方法后的值为: " + rnum);
            Console.ReadKey();



        }
        public static void Test(int n)
        {
            n += 10;
        }
        public static void Rtest(ref int rn)
        {
            rn += 10;
        }

    }
}

运行结果:


调试分析图:


内存分析图:



猜你喜欢

转载自blog.csdn.net/boy_of_god/article/details/80725233