好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

.NET:也谈谈.NET中的引用类型和值类型

.NET:也谈谈.NET中的引用类型和值类型

.NET:也谈谈.NET中的引用类型和值类型

背景

引用类型和值类型的区别好像是一个经典的面试问题,也是一个非常基础的问题,今天试着写一下,一则为了以后新入职的毕业生学习,二则希望高手批评。

几个事实 值类型的局部变量始终分配在栈中,局部变量中存储的是值。 引用类型的局部变量始终分配在栈中,局部变量中存储的是值地址(引用),地址指向的值(对象)分配在堆中。 值类型的成员变量始终内敛存储在对象中(堆中),内敛存储的是值。 引用类型的成员变量始终内敛存储在对象中(堆中),内敛存储的是值地址(引用),地址指向的值(对象)分配在堆中的另外一个区域。 一个线程拥有一个栈(对于理解多线程编程非常有用)。 线程之间共享一个堆(对于理解多线程编程非常有用)。 随着函数的调用和返回栈在不停的生长(调用)和消减(返回)。 .NET默认是按值传递参数的。 ref和out会导致按地址传递(栈的地址),也叫按引用传递。

注意事项:不要用C#中的这些事实理解Javascript、Ruby和Python等动态语言,一般会适得其反。

一个小测试

  1   using   System;
   2   using   System.Collections.Generic;
   3   using   System.Linq;
   4   using   System.Text;
   5   using   System.Threading.Tasks;
   6  
  7   namespace   StackAndHeapStudy
   8   {
   9       class   Program
  10       {
  11           static   void  Main( string  [] args)
  12           {
  13               {
  14                   var  p =  new   Program();
  15                   Console.WriteLine(p.GetHashCode());
  16                  Do( ref   p);
  17                   Console.WriteLine(p.GetHashCode());
  18               }
  19               {
  20                   var  p =  new   Program();
  21                   Console.WriteLine(p.GetHashCode());
  22                   Do(p);
  23                   Console.WriteLine(p.GetHashCode());
  24               }
  25           }
  26  
 27           static   void  Do( ref   Program p)
  28           {
  29              p =  new   Program();
  30           }
  31  
 32           static   void   Do(Program p)
  33           {
  34              p =  new   Program();
  35           }
  36       }
  37  }

备注

先把一些事实列出来,如果有朋友不是很明白,我再针对问题继续细化吧。

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于.NET:也谈谈.NET中的引用类型和值类型的详细内容...

  阅读:32次