精华内容
下载资源
问答
  • VBByval和byref的区别

    2019-03-20 09:47:01
    VBByval 和byref怎么区别?简单来说Byval是传值,byref是传地址,ByVal :表示该参数是按值方式传递的。ByRef :表示该参数按引用方式传递。下面绿茶小编为大家详细介绍Byval 和byref的区别。 1、引用参数(ref)在...

    在VB中Byval 和byref怎么区别?简单来说Byval是传值,byref是传地址,ByVal :表示该参数是按值方式传递的。ByRef :表示该参数按引用方式传递。下面绿茶小编为大家详细介绍Byval 和byref的区别。

    1、引用参数(ref)在可以作为引用参数在函数成员调用中传递之前,必须已明确赋值,而输出参数(out)在可以作为输出参数在函数成员调用中传递之前不一定要明确赋值,在该函数成员正常返回前都必须已明确赋值。

    2、在函数内部,引用参数(ref)被视为初始已赋值,输出参数(out)被视为初始未赋值。

    3、默认地,VB中的所有参数都是值传递。只有在参数的修饰符中明确包含out或ref,才是引用传递。但是需要知道的是,当参数的类型是引用类型时,你传递的是一个对象的引用而不是实际的对象。

    实例:

    sub Add1(ByVal no as int32)

    no=no+100

    end sub

    sub Add2(ByRef no as int32)

    no=no+100

    end sub

    private sub button1_click(sender as object,e as eventargs)handles button1.click

    dim a as int32

    a=100

    Add1(a)

    msgbox (“a的值为:” & a) '显示:a的值为100

    Add2(a)

    msgbox (“a的值为:” & a) '显示:a的值为200,因为Add2中的参数no为ByRef,即

    '按地址传递,因此在Add2中对no进行修改后,将会导致

    '源参数a的值也被修改。

    End Sub

    ByVal是传递值 源数据不会被修改,你可以把这个值当作自己的局部变量来使用;ByRef是传递地址,源数据可能被修改,你对这个变量的操作将对你传入的那个变量产生影响。
      
    https://www.jianshu.com/p/fe1f288be180

    展开全文
  • VB.net byval和byref

    千次阅读 2013-04-21 20:29:29
    这两个的区别针对于一般的数据类型,大家都非常的清楚,但是,当用遇到对象类型的变量的时候,要小心了,因为,对象类型的变量里存放的是对象所占内存空间的首地址,此时,无论用byval还是byref,对该对象的内部成员...

    概述

           byval是将实参所占的内存空间复制一份出来;byref是给实参另起一个别名,就好像是一个人两个名字。这两个的区别针对于一般的数据类型,大家都非常的清楚,但是,当用遇到对象类型的变量的时候,要小心了,因为,对象类型的变量里存放的是对象所占内存空间的首地址,此时,无论用byval还是byref,对该对象的内部成员的操作都是针对同一块内存空间。

    实例

    1、创建class1类,用户参数的传递用

    Public Class Class1
    '变量
    Private _name As String

    '属性
    Property name() As String
    '读操作
    Get
    Return _name
    End Get
    '写操作
    Set(ByVal value As String)
    _name = value
    End Set
    End Property
    End Class

    2、创建class2类,用于对参数的处理

    Public Class Class2
    Public Sub tryd(ByRef classx As Class1)
    '通过形参修改 name
    classx.name = "这个是《形参》操作的地址空间"
    End Sub
    End Class


    3、新建控制台应用程序,代码如下:

    Module Module1
    Sub Main()
    '定义class1类对象 进行参数的传递
    Dim s As New Class1
    s.name = "这个是《实参》操作的地址空间!"
    '定义class2类 逻辑运算
    Dim X As New Class2
    '执行参数
    X.tryd(s)
    '输出
    Console.WriteLine(s.name)
    '暂停画面
    Console.ReadLine()
    End Sub
    End Module

    运行3执行的结果如下图



    byref中的实参和形参是一个人两个名称吗?

    1、class1类和上面的一样

    2、创建class2类,用来进行逻辑运算

    Public Class Class2
    Public Sub tryd(ByRef classx As Class1)
    '形参的对象中创建新的class1
    Dim y As New Class1
    '赋值
    y.name = "一个人,两个名称"

    '给形参赋值
    classx = y
    End Sub
    End Class

    3、新建控制台应用程序

    Module Module1
    Sub Main()
    '定义class1类对象 进行参数的传递
    Dim s As New Class1
    '赋值
    s.name = "不是同一个人,两个名称!"

    '定义class2类 逻辑运算
    Dim X As New Class2
    '执行
    X.tryd(s)

    '输出实参的name属性
    Console.WriteLine(s.name)

    '暂停画面
    Console.ReadLine()
    End Sub
    End Module

    执行3的结果如下图


    展开全文
  • 在网上找了一下,觉得这个帖子关于ByVal ByRef 说的比较清楚,所以就贴过来了。 Public Class A Private _size As Int32 Public Property size() Get Return _size End Get Set(ByVal...

    在网上找了一下,觉得这个帖子关于ByVal 和 ByRef 说的比较清楚,所以就贴过来了。

    Public   Class   A
            Private   _size   As   Int32
           
            Public   Property   size()
                    Get
                            Return   _size
                    End   Get
                    Set(ByVal   Value)
                            _size   =   Value
                    End   Set
            End   Property
    End   Class

    Private   Sub   Form1_Load(ByVal   sender   As   System.Object,   ByVal   e   As   System.EventArgs)   Handles   MyBase.Load
                    Dim   a1   As   A
                    Dim   t   As   Int32
                    a1   =   New   A
                    a1.size   =   8
                    t   =   a1.size
                    updateA1ByVal(a1)
                    If   Not   IsNothing(a1)   Then
                            Console.WriteLine("a1   update   by   val   from   "   &   t   &   "   to   "   &   a1.size)
                    Else
                            Console.WriteLine("a1   changed   to   nothing   by   updateA1ByVal")
                    End   If
                    updateA1ByRef(a1)
                    If   Not   IsNothing(a1)   Then
                            Console.WriteLine("a1   update   by   ref   from   "   &   t   &   "   to   "   &   a1.size)
                    Else
                            Console.WriteLine("a1   changed   to   nothing   by   updateA1ByRef")
                    End   If
            End   Sub

            Private   Sub   updateA1ByVal(ByVal   a   As   A)
                    a.size   =   9
                    a   =   Nothing
            End   Sub

            Private   Function   updateA1ByRef(ByRef   a   As   A)
                    a.size   =   9
                    a   =   Nothing
            End   Function

    执行结果
    a1   update   by   val   from   8   to   9
    a1   changed   to   nothing   by   updateA1ByRef

            这个跟.net的后期绑定有关系,传递的参数实际上不是类A的一个对象,而是指向这个对象的一个值a1,   请注意a1本身不仅是一个符号,它有自己的值。
            byVal时,参数a的值和a1一样,所以都指向最初New出的那个实例(后期绑定)。当a.size先被修改为9时,因为最初New出的实例应经和它绑定,所以也被修改为9,然后参数a置为nothing,解除了绑定。(这里a 实际就相当一个指向a1的指针, 这个指针在指向a1对象的时候,所有的操作都会对a1对象产生作用.但是当a = Nothing, 或者 a1 指向其他对象实例的时候, a1本身就不会再受到a的影响了。)
            byRef时,参数a和a1一样(别名),所以当a被置为nothing时,a1也被置为nothing。

    套用一句大师的话
    In   C++:   pass   object   by   value   ,   pass   object   by   reference   。
    In   Java:   pass   object   reference   by   value
    也许我们可以这样说
    In   vb.net:   pass   object   reference   by   value (ByVal),   pass   object   by   reference(ByRef)。

    展开全文
  • VBByVal和ByRef

    千次阅读 2008-04-23 13:09:00
    这是vb中传值与传址的参数修饰 byval 是按值传送,在传的过程中不会改变原来的值,仅仅传送的是一个副本,而 byref 相反,从内存地址来说,后者是同一个内存地址ByVal为传值,当你把函数外的一个变量,如n传给ByVal的参数...

    这是vb中传值与传址的参数修饰

    byval 是按值传送,在传的过程中不会改变原来的值,仅仅传送的是一个副本,而 byref 相反,从内存地址来说,后者是同一个内存地址
    ByVal为传值,当你把函数外的一个变量,如n传给ByVal的参数时,在函数体内对该参数所做的任何变更,不会影响函数体外的这个n变量的值

    而ByRef为传地,即把函数体外变量n的地址传给ByRef的函数参数,这样,你在函数内容对该参数所做的变更就会体现在函数体外部的这个变量n上,也就是,你在函数内容把它变更的话,函数体外部的它也会跟着变

    =======================

    1 通过ByVal传递的变量,VB.Net会复制与源值相等的一个新的变量。而ByRef则相当于引用。
    例如我们学习C的时候得Swap()函数

    Imports System
    'Test that Can't Swap A and B
    Class MyApp
        Public Shared Sub Main()
            Dim A As Integer = 0
            Dim B As Integer = 1
            Console.writeline("Source:  A" & A & "B"& B)
            FakeSwap(A,B) ' After this FakeSwap(A,B), A still is 0 and B still is 1
            Console.writeline("After fakeSwap:  A" & A & "B"& B)
            Swap(A,B)
    ' After this Swap(A,B), A is 1 and B is 0
            Console.writeline("After Swap:  A" & A & "B"& B)
        End Sub

        ' Fake Swap Function:FakeSwap()
        Shared Sub FakeSwap(ByVal InA As Integer, ByVal InB As Integer)
            Dim Tmp As Integer
            Tmp =  InA
            InA = InB
            InB = Tmp
        End Sub

        ' Real Swap Function :Swap()
     
       Shared Sub Swap(ByRef InA As Integer, ByRef InB As Integer)
            Dim Tmp As Integer
            Tmp =  InA
            InA = InB
            InB = Tmp
        End Sub
    End Class

    2 注意的是: 如果ByVal传递的是自定义的类的一个实例,被复制的只是该实例的引用,引用所指向的资源并没有被复制。--相当于C++中的浅拷贝。

    Imports System

    ' 类A的实例MyA作为函数 TestA(ByVal InA As A)的参数,结果应该是
    ' --按值传递为浅拷贝,只是复制了一份引用--A的实例MyA和 InA共享一个资源
    Class MyApp
        Public Shared Sub Main()
            Dim MyA As A
            Console.writeline("The Original Resource of MyA is: " & MyA.Resource)
            ' Call TestA()
            TestA(MyA)
            Console.writeline("After call the ByVal fun , the resource of MyA is: " & MyA.Resource)
        End Sub    
        
    ' 函数TestA() 将MyA按值传递进去为InA 修改InA的Resource ,实际上修改的也是MyA的Resource
        Shared Sub TestA(ByVal InA As A)
            InA.Resource = 1
        End Sub
    End Class

    ' 类A 有资源 resource (integer)
    Class A
        Public Resource As Integer = 0
    End Class

    3 如果想实现类的实例(不是引用)的“按值“传递(深拷贝),则必须Overridde Clone()方法 ?还是专门有拷贝构造函数?
    方法一:
    <Serializable>_
    Class ABC
      xxx
    End Class

    然后用MemoryStream和BinaryFormatter(StreamContext要用File类型的),这样绝对是深拷贝。但是如何实现C++中的“拷贝构造”呢?

    展开全文
  • VB中的ByVal和ByRef的区别

    千次阅读 2017-07-21 11:59:59
    ByVal是按值传递,形参的改变不会造成实参的改变。ByRef是按地址传递,形参的改变会造成实参的改变。这就像是其它语言中的引用传递一样,如php中的 &amp;$args举个例子:Module Module1 Sub Main() Dim i As...
  • vb.net中关于byval和byref的使用

    千次阅读 2012-11-27 17:26:00
    vb.net中,byval和byref使用是不同的: .NET中CLR的类型系统将对应简单值的类型同对应传统“对象”的类型区分开来。 前者被称为值类型(value type),后者被称为引用类型(reference type)。 值类型直接包含它们...
  • byVal和byRef

    千次阅读 2009-03-17 16:11:00
    Tiger_Zhao真是个水平又高又耐心的好筒子,又帮我弄清楚了byVal和byRef的区别,小结在这里。 (1)VB里函数参数缺省是byRef的。(2)简单的说。byRef参数是传地址,当函数内部改这个参数的值的时候会反映到调用函数...
  • Sub MySub(ByVal LoadList1 As List(Of String)) LoadList1.Add("A") LoadList1.Add("B") LoadList1.Add("C") End Sub Sub MySub1() MySub(List1) MsgBox(List1.Count) End Sub End Class
  • 初学VB.Net ,总结一下ByVal和ByRef 1 通过ByVal传递的变量,VB.Net会复制与源值相等的一个新的变量。而ByRef则相当于引用。 例如我们学习C的时候得Swap()函数 Imports System Test that Cant Swap A and B Class ...
  • VB.Net的ByVal和ByRef --ByVal时的浅拷贝和深拷贝,关键词是VB,B.,.N,Ne,et,t的,的B,By,yV,Va,al,l和,和 B,By,yR,Re,ef,f-,--,-B,By,yV,Va,al,l时,时的,的浅,浅拷,拷贝,贝和,和深,深拷,拷贝,贝, ...
  • VB中形参声明有两种方式,一种是ByVal,一种是ByRef,如果是ByVal则在传递参数时将实参的一个拷贝传递给子程序,子程序对参数的修改不会影响原有参数。如果是ByRef,则将实参的指针传递给子程序,子程序对参数的修改...
  • VB函数参数的使用ByvalByref 在上位机开发过程中使用VB.net开发的,调用c写得dll,传入参数char*,使用Byval stringBuilder;传入参数const char* Byval string VBByref是引用的形式,但是在c库中无法使用 待测...
  • Byval Byref的区别

    千次阅读 2013-07-22 21:25:22
    VB中,提高过程和和函数,一定少不了参数,参数传递时过程中非常重要的问题。通过实际参数形式参数的传递可以实现调用过程被调用过程之间的信息交换。在这里首先要明白实参形参。举个例子吧: 假设定义一个...
  • ByVal和ByRef有什么区别

    千次阅读 2007-05-05 13:43:00
    VBByVal和ByRef有什么区别原理: byval 是按值传送,在传的过程中不会改变原来的值,仅仅传送的是一个副本, 而 byref 相反,从内存地址来说,后者是同一个内存地址 区别: 就是变量如果以ByVal传递给过程,过程里有...
  • ByVal是按值传递 就是不改变地址里的变量值 而ByRef是改变地址里的变量值的 <br />ByVal传递的只是一个值 向一个地址传递一个值进去 而ByRef的形参实参共用一个储存单元 因为他们是...
  • byval 和byref的区别,今天刚明白。

    千次阅读 2005-01-23 23:20:00
    以前看一本书上,写着VB的两种参数传递方式:byval byrefbyval叫做“传值”,想当于把值复制一份到新的变量中。而byref叫做传址,相当于把原变量的地址传过去。不过今天我发现,byref的传址,其实并非相当于C++中的...
  • 用实际代码的形式阐述了ByVal和ByRef的区别以及形参和实参的区别。 源码在VB.net 2010下调试通过。 欢迎指正!
  • 用代码的形式阐述了ByVal和ByRef的区别以及形参和实参的区别。源码在VB.net 2010下调试通过。 欢迎指正!
  • VBByRefByVal区别

    2019-09-22 08:53:15
    函数调用的参数传递有“值传递”“引用传递”两种传递方式。如果采用“值传递”,在函数内部改变了参数的值,主调程序的对应变量的值不会改变...在VBByRef表示引用传递,ByVal为值传递,VB默认采用引用传递,C ...
  • ByValByRef(默认值) 这两个是子过程的参数传递时,指定参数按什么传递的 ByVal(按值传递) ByRef(按地址传递) 具体这样来理解: 过程中的参数列表,我们称形参 调用过程...
  • 简而言之,ByRef ByVal 的区别在于参数源是否可以被函数修改,前者(默认方式)是可以被修改的,而后者是不能被修改的。例:Private Function Func(ByRef argv1 As String, ByVal argv2 As String) ...
  •  .Net 中不同,VB6 中默认是使用 ByRef 来传递参数了,看来似乎没有什么可以优化得地方。 可是,实际上 如果你调用 API 得话,从 API浏览器复制下来得代码却是 强制使用 ByVal 传参得 这就给了我们优化得机会...
  • 按值传递(Byval)按地址传递(ByRef)---参数传递

    千次阅读 热门讨论 2012-08-08 11:25:21
    仔细想想还是很模糊,从开始接触C++中的参数传递,只知道有这么个东西,但你要是让我说明白,有点够呛,在编程序的时候呢都是记住了一些写法才不会出错,紧接着学习C语言,Java都是如此,最近由于学习的需要,我要进行VB的...
  • VB传值传地址问题

    千次阅读 2015-10-17 19:43:29
    传递参数值时,分为Byval 和Byref 参数分为形参和实参, 形参指的是过程名称中用括号括起来的参数, 实参指的的是调用过程中,向过程传递的数据参数。 可以理解为:形参相当于公式中的自变量,实参相当于使用...
  • vb.net 教程 2-9 过程

    千次阅读 2017-04-10 22:49:52
    版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者...访问级别 Sub 函数名称(ByVal/ByRef 参数 as 类型, ByVal/ByRef 参数2 as 类型……) 语句块 end sub 访问级别 Function ...

空空如也

空空如也

1 2 3 4
收藏数 61
精华内容 24
关键字:

byval和byrefvb