某年某月,笔者去面试招行的一个外包项目,辗转来到面试地点以后,面试官给了我一份试卷,试卷只有两道题目,其中一道是这样的:

阅读以下程序

  1. 1 class Program
  2. 2 {
  3. 3 struct Point
  4. 4 {
  5. 5 public int x;
  6. 6 public int y;
  7. 7 public Point(int x,int y)
  8. 8 {9
  9. 9 this.x = x;
  10. 10 this.y = y;
  11. 11 }
  12. 12 }
  13. 13
  14. 14
  15. 15 static void Main(string[] args)
  16. 16 {
  17. 17 Point p1 = new Point(100,100);
  18. 18 Point p2 = p1;
  19. 19 p1.x = 200;
  20. 20 Console.WriteLine("{0},{1}", p1.x, p2.x);
  21. 21 Console.ReadLine();
  22. 22
  23. 23 }
  24. 24 }

请写出p1.x和p2.x的值。

   笔者属于那种基础不是很扎实的那种码农,平时也就是个CURD Boy,虽然明白这道题是考察变量在内存中的分配,但是之前没怎么在意这方面的问题,一时间竟然答不上来。

  其实这道题目只要理解Struct结构是值类型的变量就好了。所谓的值类型,在概念上讲,就是直接存储变量的值。那么Point p2=p1这一句的意思就是在内存(堆栈)的另一个地方创建一个一模一样的变量p2,p2和p1值相同,但是是两个完全不同的变量,改变p1的值不影响p2,所以最后p1.x=200,p2.x=100.

  如果将题目中的struct改为class,即代码变成了这样:

 

  1. class Program
  2. {
  3. class Point
  4. {
  5. public int x;
  6. public int y;
  7. public Point(int x,int y)
  8. {
  9. this.x = x;
  10. this.y = y;
  11. }
  12. }
  13.  
  14. static void Main(string[] args)
  15. {
  16. Point p1 = new Point(100,100);
  17. Point p2 = p1;
  18. p1.x = 200;
  19. Console.WriteLine("{0},{1}", p1.x, p2.x);
  20. Console.ReadLine();
  21.  
  22. }
  23. }

  结果又是怎么样呢?

 

   答案是p1.x=200,p2.x=200。因为在C#中,Class是引用类型,p1和p2其实指向同一块内存区域,修改p1的指向值会影响p2指向的值。有点类似于C#的指针。

   总结一下,就是C#的数据类型分为值类型和引用类型两种。值类型存储变量的值,引用类型存储变量的引用。二者可以存储的地方不同,值类型存储在堆栈中,引用类型存储在托管堆上。关于堆栈和托管堆,需要进一步展开学习。

版权声明:本文为wangwangmiao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wangwangmiao/p/9013813.html