001_值类型与引用类型

C#中的值类型和引用类型基本理解

 

namespace _001_值类型与引用类型
{
    /*
     * 值类型的变量,编译器会在栈上开辟一块相应大小的内存块来存储当前的的值类型变量
     * 大多数基元类型(int,float,double,char等)的数据除了string之外都是值类型
     * 
     * 引用类型,编译器不会生成相应的变量内存空间,编译器为一做的就是在栈上开辟一小块内存用来存储引用类型的地址。
     * 
         */

    class Cricle
    {
        public Cricle(int i)//这里的局部变量与该方法的指针都是在栈上申请的
        {
            double c = 3.14 * i * i;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            int i;//这里是值类型的的声明
            i = 2;
            Cricle c = new Cricle(i);//这里的new操作实际上就是再创建对象时在对上开辟一块内存来存储该对象
            Console.WriteLine(c);
            Pass.doWork();
            Console.ReadKey();
        }
    }
    //解析以下例子中的i的值
    class ValueSet
    {
        public int i=0;
    }
    class Pass
    {
        public static void doWork()
        {
            int i = 0;
            Console.WriteLine(i);//这里是实参所以输出的是0
            Pass.Value(i);       
            Console.WriteLine(i);//这里调用Value方法的时候传入的拷贝,所以i的值本身是不会变的

            ValueSet value01 = new ValueSet();
            Console.WriteLine(value01.i);
            Pass.Value(value01.i);//这里的传参和上面的拷贝是一个道理,都是在调用方法是掺入了这个数的浅拷贝所以并不会改对象中的变量在堆上的值
            Console.WriteLine(value01.i);
            Pass.Value01(value01);//这里传入一个对象当适用对象来读该对象存储的数据时,使用的使用引用,他们都是执行都一块内存因此也会改变对象在堆上的值
            Console.WriteLine(value01.i);
        }
        public static void Value01(ValueSet param)
        {
            param.i = 42;
        }
        public static void Value(int param)
        {
            param = 42;
        }
    }
}

结果是:

 

posted @ 2019-09-16 22:43  古小羊  阅读(42)  评论(0)    收藏  举报