`
tubaluer
  • 浏览: 1447336 次
文章分类
社区版块
存档分类
最新评论
  • sblig: c / c++ 是不一样的都会输出 100
    j = j++

引用类型与值类型

 
阅读更多

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

分享到:
评论

相关推荐

    值类型和引用类型的区别

    值类型和引用类型的区别: 似乎“值类型和引用类型的区别”是今年面试的流行趋势,我已然是连续三次(目前总共也就三次)面试第一个问题就遇到这个了,这是多大的概率啊,100%. 言归正传,咱还是先来探讨探讨这二者...

    引用类型与值类型的运算

    小技能:值类型和引用类型的数据进行运算

    C#中引用类型和值类型的区别

    C#中引用类型和值类型的区别C#中引用类型和值类型的区别

    c# 引用类型与值类型的区别详解

    解析:CLR支持两种类型:值类型和引用类型。用Jeffrey Richter(《CLR via C#》作者)的话来说,“不理解引用类型和值类型区别的程序员将会把代码引入诡异的陷阱和诸多性能问题”。这就要求我们正确理解和使用值类型...

    c# 值类型 引用类型 内存分析

    c# 值类型 引用类型 内存分析 图解 ,从根本上理解值类型和引用类型变量的本质区别。

    值类型与引用类型

    这是一个值类型与引用类型的小测试!分清什么事值类型与引用类型!

    C#引用类型和值类型的区别

    值类型直接存储其值,变量本身就包含了其实例数据,而引用类型保存的只是实例数据的内存引用。因此,一个值类型变量就永远不会影响到其他的值类型变量,而两个引用类型变量则很有可能指向同一地址,从而发生相互影响...

    C#中引用类型和值类型

    C#中引用类型和值类型 包含了C#中的所有引用类型和值类型的分类,别对于各个类型的关键字,给出来相应的例子。值得参考。

    值类型与引用类型(.html)

    值类型与引用类型的知识,html文件,可以自行学习。值类型与引用类型的知识,html文件,可以自行学习。

    值类型引用类型.go

    值类型引用类型.go

    引用类型按值传递举例.png|引用类型按值传递举例.png

    Js引用类型按值传递的题目:两个变量间赋值时,以及作为变量给函数传参时,只是将原变量中的值复制一个副本给对方变量或形参变量 i. 对于原始类型的值,修改新变量,不影响原变量 ii. 对于引用类型的值的值,因为...

    C#值类型与引用类型区别

    C#值类型与引用类型区别,和一些基础算法,刚入门的小伙伴,希望对你有用

    C#引用类型的赋值 类的赋值

    C#中除了基本类型以外的类型都是引用类型。...所以,当引用类型之间相互赋值的时候,只是将堆栈中的值 (可以理解为所指向的“堆”地址)相互赋值,这样一来他们指向的其实是一个地址。见下 面的例子:

    浅谈C#中的值类型和引用类型

    值类型转为引用类型称成为装箱,引用类型转为值类型称为拆箱 以下是值类型和引用类型对照表 从上图可以简单看出:string,Object,数组,class是引用类型,简单类型,枚举,结构是值类型。 二、代码展示 定义一个类...

    C#基础知识 值类型、引用类型

    一起回忆那些年美好的回忆吧,缅怀青春,昂首迎接新的挑战,我们可以走的更远!

    面试题_作用域和值类型引用类型的传递1.avi

    面试题_作用域和值类型引用类型的传递1.avi

    JavaScript中值类型和引用类型的区别

    JavaScript中值类型和引用类型的区别 JavaScript中的值类型的值是不可变的: 任何方法都无法改变值类型的值。数字、布尔值、null和undefined等都属于不可变类型。比如,修改一个数值的内容,本身就说不通。虽然字符...

    值类型和引用类型Demo

    值类型和引用类型Demo,附加学习文档,ppt,原理图, 绝对好资源 欢迎下载!

    JavaScript数据类型之基本类型和引用类型的值

    ECMAScript变量包含两种不同数据类型的值:基本类型值和引用类型值。基本类型值是简单的数据段,而引用类型值指那些可能由多个值构成的对象。 在将一个值赋给变量时,解析器必须确定这个值是基本类型还是引用类型。...

Global site tag (gtag.js) - Google Analytics