值类型和引用类型的区别

区别:
1、值类型通常被分配在栈上,它的变量直接包含变量的实例,使用效率比较高。
2、引用类型分配在托管堆上,引用类型的变量通常包含一个指向实例的指针,变量通过该指针来引用实例。
3、值类型继承自ValueType(注意:而System.ValueType又继承自System.Object);而引用类型继承自System.Object。
4、值类型变量包含其实例数据,每个变量保存了其本身的数据拷贝(副本),因此在默认情况下,值类型的参数传递不会影响参数本身;而引用类型变量保存了其数据的引用地址,因此以引用方式进行参数传递时会影响到参数本身,因为两个变量会引用了内存中的同一块地址。
5、值类型有两种表示:装箱与拆箱;引用类型只有装箱一种形式。我会在下节以专门的篇幅来深入讨论这个话题。
6、典型的值类型为:struct,enum以及大量的内置值类型;而能称为类的都可以说是引用类型。
7、值类型的内存不由GC(垃圾回收,Gabage Collection)控制,作用域结束时,值类型会自行释放,减少了托管堆的压力,因此具有性能上的优势。例如,通常struct比class更高效;而引用类型的内存回收,由GC来完成,微软甚至建议用户最好不要自行释放内存。
8、值类型是密封的(sealed),因此值类型不能作为其他任何类型的基类,但是可以单继承或者多继承接口;而引用类型一般都有继承性。
9、值类型不具有多态性;而引用类型有多态性。
10、值类型变量不可为null值,值类型都会自行初始化为0值;而引用类型变量默认情况下,创建为null值,表示没有指向任何托管堆的引用地址。对值为null的引用类型的任何操作,都会抛出NullReferenceException异常。
11、值类型有两种状态:装箱和未装箱,运行库提供了所有值类型的已装箱形式;而引用类型通常只有一种形式:装箱。

### C# 中值类型引用类型的概述 在C#编程语言里,数据类型分为两大类:值类型引用类型值类型直接保存它们的实际数据,而引用类型则存储指向实际对象的引用[^1]。 #### 值类型的特征 - **内存位置**:通常情况下,值类型数据会被分(stack)上,这意味着创建速度较快且销毁也迅速。 - **复制行为**:每当传递或赋值一个值类型变量时,实际上是拷贝了一份完整的数据副本给新的变量。因此修改新变量中的数据不会影响原始变量的内容。 - **不可为空性**:默认状态下,值类型不允许为`null`,除使用可空(`Nullable`)修饰符来定义该字段可以接受`null`作为合法状态之一。 ```csharp int number = 5; // 下面这条语句会报错因为 int 不允许为 null // int? nullableNumber = null; // 正确写法应加上 ? Console.WriteLine(number); // 输出: 5 ``` #### 引用类型的属性 - **内存管理**:对于引用类型而言,其本身仅包含了一个指针(即地址),真正的对象存在于堆(heap)之中。当声明一个新的引用类型实例化之后,在上的部分只记录着通往堆里的具体路径而已。 - **共享特性**:多个不同的引用可能指向同一个对象,所以改变其中一个引用所指向的对象内部成员会影响到通过其它任何相同引用访问的结果。 - **支持 `null`** :不同于值类型,默认情况下所有的引用类型都可以设置成`null`表示未初始化的状态。 ```csharp string strA = "hello"; string strB = strA; strB += " world!"; Console.WriteLine(strA); // 输出: hello Console.WriteLine(strB); // 输出: hello world! ``` 上述代码片段展示了字符串拼接过程中产生的不同结果,尽管最初两个字符串引用相同的常量池条目,但在执行加号运算后产生了全新的字符串并更新了`strB`指向的位置,而原`strA`保持不变[^4]。 #### 性能考量 考虑到性能因素,《CLR via C#》提到过如果开发人员未能充分认识到这两者之间的差异,则可能导致难以察觉的问题以及不必要的资源浪费。例如频繁地将大尺寸结构体当作参数传递可能会带来显著的成本增长;同样地,不当处理大型数组或其他复杂对象也会造成垃圾回收器负担加重等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值