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

本文探讨了.NET中值类型与引用类型的关键区别,包括它们的内存分配位置、如何传递参数以及不同类型的变量如何存储等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

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

几个事实

  • 值类型的局部变量始终分配在栈中,局部变量中存储的是值。
  • 引用类型的局部变量始终分配在栈中,局部变量中存储的是值地址(引用),地址指向的值(对象)分配在堆中。
  • 值类型的成员变量始终内敛存储在对象中(堆中),内敛存储的是值。
  • 引用类型的成员变量始终内敛存储在对象中(堆中),内敛存储的是值地址(引用),地址指向的值(对象)分配在堆中的另外一个区域。
  • 一个进程拥有多个AppDomain。
  • 一个AppDomain拥有一个堆。
  • 一个进程可以运行多个线程。
  • 一个线程拥有一个栈(对于理解多线程编程非常有用)。
  • 一个AppDomain中的所有线程之间共享一个堆(对于理解多线程编程非常有用)。
  • 随着函数的调用和返回栈在不停的生长(调用)和消减(返回)。
  • .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 }

备注

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值