CLR的类型系统将对应简单值的类型同对应传统“对象”的类型区分开来。前者被称为值类型(value type);
后者被称为引用类型(reference type)。
值类型直接包含它们的数据,值类型的实例要么在堆栈上,要么内联在结构中。
引用类型存储对其值的内存地址的引用,位于堆上。
.NET中CLR的类型系统将对应简单值的类型同对应传统“对象”的类型区分开来。
前者被称为值类型(value type),后者被称为引用类型(reference type)。
值类型直接包含它们的数据,值类型的实例要么在堆栈上,要么内联在结构中。
引用类型存储对其值的内存地址的引用,位于堆上。
值类型和引用类型的赋值操作是不同的:
1)对于引用类型,赋值只是简单地复制对原实例的一个引用,
这导致在内存中两个变量将引用同一个实例。
Dim o1 As Object = New Object
Dim o2 As Object
o2 = o1 'o1给o2赋值,传递引用。o1,o2指向同一实例
2)对于值类型,赋值是将一个实例的内容改写为其他实例的内容。
Dim a1 As Integer = 1
Dim a2 As Integer = 0
a2 = a1 'a1给a2赋值,a2内容被改写为1, a1与a2不是同一实例
3) 向方法传递参数是赋值的变体。当向方法传递参数时,方法的声明
决定参数是按引用传递还是值传递(不管参数是值类型还是引用类
型)。默认是按值传递参数(ByVal),将导致该方法或者被调用方具
有自己的该参数值的私有拷贝。如果参数是引用类型,那么,按值
传递的是引用(而不是实例,就是把对该实例的引用复制一份传递给
参数)
Dim o As Object = New Object
Private Sub Adjust(ByVal obj As Object)
'...
End Sub
Adjust(o) '<--- 这里其实,有参数赋值的过程 o = obj,
' o被方法Adjust复制了一份。
' 因为o是引用类型,所以o和obj指向同一实例。
' 这里修改了obj就相当修改了o
-----------------------------------------------------
修改一下Adjust方法:
Private Sub Adjust(ByVal obj As Object)
obj = New Object
End Sub
再调用这个方法的时候,obj在方法里指向了一个新的实例,
与o指向的实例没关系了。
按引用传递参数导致方法或被调用方法得到一个托管指针,它指
回调用方的变量。方法对值类型或引用类型所作的任何修改对于
调用方都是可见的。并且,假如这个方法对一个对象引用的参数
进行修改,使之重定向到内存中的另外一个对象,那么,这个改变
也将影响调用方的变量。
Private Sub Adjust(ByRef obj As Object)
obj = New Object
End
Adjust(o) '这时候, o 指向方法里New出来的实例。
值类型在参数ByVal, ByRef上比较:
ByVal:
Dim a1 As Integer = 1
Console.WriteLine( "a1 = {0}", a1.ToString() ) 'a1 = 1
Add(a1)
Console.WriteLine( "a1 = {0}", a1.ToString() ) 'a1 = 1
Private Sub Add(ByVal x As Integer)
x = x + 1
End Sub
'------------------------------------------------------
ByRef:
Dim a1 As Integer = 1
Console.WriteLine( "a1 = {0}", a1.ToString() ) 'a1 = 1
Add(a1)
Console.WriteLine( "a1 = {0}", a1.ToString() ) 'a1 = 2
Private Sub Add(ByRef x As Integer)
x = x + 1
End Sub
分享到:
相关推荐
### 值类型与引用类型的运算过程 根据题目描述,我们可以了解到在JavaScript中处理值类型和引用类型之间的运算时会发生以下两个步骤: 1. **调用引用类型的valueOf方法**: - 当值类型的数据与引用类型的数据进行...
在C#编程语言中,类型系统是其核心组成部分,它主要分为两大类:引用类型和值类型。...总之,在C#中合理选择和使用引用类型与值类型,能够显著提升程序的性能和维护性,开发者应当根据具体需求和场景灵活应用。
### 值类型和引用类型的关键区别 #### 1. 定义与概念 - **值类型**: 在声明变量时,直接将...通过以上对比分析,我们可以更深入地理解值类型与引用类型之间的区别及其应用场景。这对于编写高效、健壮的程序至关重要。
解析:CLR支持两种类型:值类型和引用类型。用Jeffrey Richter(《CLR via C#》作者)的话来说,“不理解引用类型和值类型区别的程序员将会把代码引入诡异的陷阱和诸多性能问题”。这就要求我们正确理解和使用值类型...
本文将深入探讨C#中的核心概念:值类型和引用类型。这两种类型在内存管理和数据处理上有着显著的区别,理解它们对于编写高效且无错的代码至关重要。 值类型(Value Types)包括基本类型如整型(int)、浮点型...
C#的统一类型系统允许值类型通过装箱和拆箱与对象进行交互。装箱是将值类型转换为`System.Object`的过程,会在堆上创建一个新的对象;拆箱是将对象转换回原始值类型,但这个过程有性能开销,应尽量避免不必要的装...
拆箱是将引用类型转换回原来的值类型,需要确保引用非null且实际指向的类型与目标值类型兼容。 理解值类型和引用类型是掌握C#编程的基础,正确选择和使用它们可以提高程序效率,避免不必要的内存开销,并有助于编写...
c# 值类型 引用类型 内存分析 图解 ,从根本上理解值类型和引用类型变量的本质区别。
在C#编程语言中,值类型和引用类型是两种基本的数据类型,它们在内存管理和操作方式上有着显著的差异。了解这些差异对于编写高效、安全的代码至关重要,尤其是在处理大量数据或复杂对象时。 首先,让我们来探讨值...
这是一个值类型与引用类型的小测试!分清什么事值类型与引用类型!
C#中的引用类型和值类型 C# 中的类型系统可以分为两大类:引用类型(reference type)和值类型(value type)。了解这两种类型的差异是非常重要的,因为它们在内存中的存储方式、赋值方式和使用场景都有所不同。 ...
此外,C#中还引入了结构体和类之间的桥梁——装箱(boxing)和拆箱(unboxing),允许值类型与引用类型之间进行转换,但这种转换会带来额外的性能开销。 总的来说,理解值类型和引用类型的基本概念、工作原理以及...
值类型引用类型.go
在Java或C#这样的面向对象语言中,引用类型与值类型有着显著的区别。值类型存储的是实际的数据,而引用类型则存储的是指向数据在内存中位置的指针。当创建一个引用类型的实例时,会在堆内存中分配空间,而变量则保存...
Js引用类型按值传递的题目:两个变量间赋值时,以及作为变量给函数传参时,只是将原变量中的值复制一个副本给对方变量或形参变量 i. 对于原始类型的值,修改新变量,不影响原变量 ii. 对于引用类型的值的值,因为...
引用类型的变量不直接存储值,而是存储对内存空间的引用,也就是地址。例如 MyDate today;这里的 today 变量存储的是对 MyDate 对象的引用,而不是实际的日期值。 在赋值方面,基本类型和引用类型也存在区别。基本...
在编程世界中,值类型和引用类型是两个基础且重要的概念,它们决定了变量存储和操作的方式。本讲解将深入探讨这两个概念,以便更好地理解和运用在实际编程中。 首先,值类型(Value Types)包括基本数据类型,如...
在C#编程语言中,变量分为两种类型:值类型和引用类型。本文将重点介绍引用类型的赋值特点及其背后的实现机制。 #### 一、引用类型的定义与特点 在C#中,除了基本类型(如`int`、`char`、`float`等)之外的所有...
首先,我们要明白值类型与引用类型的基本概念: 1. 值类型:值类型包括基本数据类型(如int、double、bool)以及结构(struct)。它们在内存中直接存储其值。当一个值类型变量被赋值时,实际上是拷贝了该值到新的...