C#中的栈和堆、值类型与引用类型、值参数、引用参数、输出参数、参数数组

程序运行时,数据必须存储在内存中,一个数据需要多大的内存、存储的位置、如何存储依赖于该数据的数据类型。运行中的程序使用两个内存区域来存储数据:栈和堆。

栈:     

           栈是一个内存数组,后进先出的数据结构,是一块地址连续的存储空间,变量在栈中的地址是连续的,根据变量类型的不同,在栈中所占的空间大小不同。当栈中存储的变量为引用类型时,存储的是变量的引用(堆中数据的地址),指向堆中的对象。

                       

          

                    

堆:    

          堆中的数据是不连续的

值类型:

               数据存放在栈里

引用类型:

              引用类型的数据存放在堆里,引用类型的引用(可以理解为数据在堆中的地址)存放在栈里。

                                 

于引用类型的任何对象,它所有的数据成员都存放在堆里,无论他的成员是值类型还是引用类型。如果引用类型成员值类型或引用类型的数据的引用部分,既可以存放在堆里也可以存放在栈里看情况。

                                 

                               

 参数类型:

方法中的参数分四种,值参数、引用参数、输出参数,引用参数前面有加Ref修饰符,除了引用参数,输出参数、数组其它参数都称为值参数,参数是针对方法的。

C#中的数据类型分为值类型和引用类型,注意参数和类型的区别

 

方法的形参为值参数: 

 方法中的形参在方法开始被调用时,系统在栈中为形参开辟新的空间,不管形参是值类型还是引用类型,都会分配空间。

如果形参是值类型,在栈上将值类型实参的数据赋值给值类型的形参,实参和形参在栈上的地址不一样,存储的值一样。

如果形参是引用类型,在栈上将实参的在栈上的引用(堆中存储数据的地址)赋值给形参,栈中实参和形参的地址相同,共同指向堆中同一个对象。

方法执行后,形参从栈中弹出释放。

如下:a1,a2 实参;f1,f2形参,值类型的实参在方法执行后,值不会改变,引用类型的实参在方法执行完后,值会发生变化

                                            

          

                       

方法的形参为引用参数:

               系统不会为引用参数的形参在栈上开辟空间,形参和实参在栈上的地址相同,指向相同的的内存位置。在方法执行过程中,对新参作的任何改变,在方法完成后依然有效,表现在实参变量上。

          

                          

                                                

                                     

        

值参数和引用参数最大的区别是:值参数类型的形参在栈上开空间,引用参数类型的形参就是实参的别名,形参在栈上不开空间,在栈上的地址一样。

方法的形参为输出参数:

                          

       

         

                 

               

方法的形参为参数数组: 

         又名可变参数,见书

                                   

   

猜你喜欢

转载自blog.csdn.net/ABC13222880223/article/details/84954208