首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在同一套路中传递ByRef和ByVal参数的不良做法?

在同一套路中传递ByRef和ByVal参数的不良做法是将两种参数混合使用,导致代码可读性和可维护性降低。这种不良做法会给开发过程中引入潜在的错误和难以调试的问题。

ByRef和ByVal是用于传递参数的两种不同方式。ByRef表示按引用传递,即传递参数的内存地址,对参数的修改会影响到原始变量。ByVal表示按值传递,即传递参数的副本,对参数的修改不会影响到原始变量。

不良做法的示例代码如下:

代码语言:vb
复制
Sub BadPractice(ByRef arg1 As Integer, ByVal arg2 As Integer)
    arg1 = arg1 + 1
    arg2 = arg2 + 1
End Sub

Sub Main()
    Dim num1 As Integer = 1
    Dim num2 As Integer = 2

    BadPractice(num1, num2)

    Console.WriteLine("num1: " & num1) ' 输出:num1: 2
    Console.WriteLine("num2: " & num2) ' 输出:num2: 2
End Sub

在上述示例中,BadPractice过程接受一个ByRef参数arg1和一个ByVal参数arg2。在BadPractice过程中,对arg1的修改会影响到原始变量num1,而对arg2的修改不会影响到原始变量num2。这种混合使用ByRef和ByVal参数的方式容易引起混淆和错误。

为了避免这种不良做法,应该在同一套路中统一使用ByRef或ByVal参数传递方式,以提高代码的可读性和可维护性。如果需要在同一套路中传递多个参数,建议统一使用ByRef或ByVal方式,避免混合使用。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

过程(四)传地址传值

上节介绍了过程传递参数部分内容,即实参与形参结合。 VBA实参可以通过两种方式将数据传递给形参,分别为传地址传值,都是创建通用过程定义变量时。...一、 传 地 址 传地址是VBA默认数据传递方式,定义过程时,如果形参前面有关键字ByRef或者省略,则该参数通过传地址方式传递。...这是因为调用过程时,将变量b做实参按地址传递给变量a,变量b变量a指向同一个内存单元,一起变化。...定义过程形参面前添加ByVal关键字,则该参数就按传值方式传递。 将上面示例传地址方式改成传值方式再运行一次,对比下结果。...而传值则相反 实际,可以先用传值方式,等调试后,再改为传址方式 3,用传址方式,要求实参与形参数据类型完全一致 ---- 本节主要介绍过程参数传递问题,重点是区分传地址传值两种方式,结合示例去理解

4.8K30

VBA Object对象函数参数传递

VBA函数参数传递方式是ByvalByref,数值类型、Stirng等那些值类型是要非常注意用哪种方式。对于Object对象引用类型一直都说2种方式完全没有区别。...Object对象ByvalByref参数真的没有区别吗? 对于操作这个Object对象来说,可以认为是没有区别,但是传递过程其他数据类型参数传递是一样,遵守规则并没有改变。...ByVal 参数传递时候,会在内存另外复制一份,函数操作这个副本传递之前那个变量已经没有了任何关系; Byref 会把参数内存地址传递给函数,函数接收到这个是通过内存地址来读取或者改写,操作就是原来变量...可以理解为参数其实就是一个LongPtr类型,所以你是复制一份这个LongPtr类型数字传递,还是把这个LongPtr类型所在内存地址传递给函数,对于Object这个对象来说,是没有区别的。...(rng) = x022edd0, ObjPtr(rng) = 0xfaaddd0, VarPtr中保存数据 = 0xfaaddd0 从打印输出可以看出,Byval传递需要复制参数,其实只是把保存对象地址那个内存地址

3.5K20
  • VBA使用API_01:读取文件

    现在想想其实应该先了解一些数据类型、参数传递、内存方面的东西,再来用API时候,就会顺利许多。...API复杂之处我认为就是参数多样,而且传递时候非常要注意是传值还是传地址。...2、参数传递参数 很多参数API只是使用,所以VBA里传递是按值传递还是按照地址传递其实都是一样,这个VBA里Function是一样。...另外有很多复杂参数,一般都不大常用,这种VBA里我们直接声明为Byval传递0就可以,像CreateFile里dwFlagsAndAttributeshTemplateFile我们都可以设置为...指针参数 这是一种非常容易出错参数,比如ReadFile中有个参数lpNumberOfBytesRead,这种参数是一种指针,API函数会在内部操作这个指针,所以如果这个参数一旦传递错误,比如按Byval

    1.6K10

    Function函数

    这种将复杂功能分解成若干小功能,由各个小功能来组合完成一个复杂功能编程思想是非常重要: 可以简化开发难度 提高代码复用 2、Function参数 VBA参数传递有2种方式: Byval...Byref 传地址,传递是变量地址,就是原始变量。 打个比方: 孙悟空妖怪打架,他法术好,用个毫毛就能变个分身,他让分身去打架,妖怪伤害了分身,不会影响他自己。这就是Byval。...如果参数前面省略了修饰符,默认是Byref(个人认为这个默认非常不好,我刚开始用VBA时候碰过这个问题,莫名其妙不知道为什么变量值不对了)。...这2种方式区别初学者只要记住(非常重要)就可以,要理解有点难度,需要一定计算机内存方面的知识。 只要简单记住,如果你传递变量只是给其他函数使用,并不需要改变的话,用Byval。...如果其他Sub过程也需要这个功能,直接调用即可,这也就是代码复用了。 4、小结 介绍了Function规则、参数传递、Function作用等。

    1.2K30

    VB.NET自我总结语法

    Next  For Each item In List            //exit for  Next 五、过程函数 Public Sub 函数名称(ByVal/ByRef  参数名  As... Integer) as 类型 End Sub Public Function 函数名称(ByVal/ByRef  参数名  As Integer) as 类型   'vb6.0 带返回值函数写法  ...Dim str2 As String = "222"  Return str2 End Function 六、vb.net 模块(Module),一般用途一般只用来定义全局变量公用方法。...所以模块有点虚概念 模块可以被组织到命名空间中去,因为模块其实是个虚,所以它方法也可以直接外层命名空间调用。      七、多个相同事件,同用同一个事件。...比如你一个对象有一个事件A,执行过程,这个对象RaiseEvent   A,那么调用者handles   对象.A   SUB就会被执行。

    72010

    Vb.netVB 声明API功能父窗口功能

    事实上细致看两者并没有多大差别,先看看在vb.net怎样调用: 首先加入一个类模块。...函数声明差别: 1、当中最基本一个差别就是vb定义数据类型是long。...而在vb.net则使用Integer来代替long,由于vb.netInteger类型是32位long类型一样。...2、要注意使用ByValByRef ByVal传递值,源数据不会被改动,能够把这个值当做自己局部变量来使用;(传递參数内存给被调用者) ByRef传递地址,源数据可能被改动。...(传递參数地址给被调用者) 3、主窗口调用API函数时候要注意“Handel.ToInt32”使用,他等同于vb调用过程.hwnd H:handle;Wnd:变量对象描写叙述,也就所谓窗口。

    81240

    VB.NET语法小结

    Next For Each item In List //exit for Next 五、过程函数 Public Sub 函数名称(ByVal/ByRef 参数名...As Integer) as 类型 End Sub Public Function 函数名称(ByVal/ByRef 参数名 As Integer) as 类型 'vb6.0 带返回值函数写法...Dim str2 As String = "222" Return str2 End Function 六、vb.net 模块(Module),一般用途一般只用来定义全局变量公用方法。...所以模块有点虚概念 模块可以被组织到命名空间中去,因为模块其实是个虚,所以它方法也可以直接外层命名空间调用。 七、多个相同事件,同用同一个事件。...比如你一个对象有一个事件A,执行过程,这个对象RaiseEvent A,那么调用者handles 对象.A SUB就会被执行。

    1.5K30

    VB语言使用ADO连接、操作SQLServer数据库教程

    ydl890406大大,VB群写这东西时,让我借用了,后来我发现有很多错误,y大神修改几次后还是有错误,干脆重写了一遍,这就是后来代码。...第二部分是AOD代码连接,由于第二部分涉及到Recordset对象Connection对象,自己学一下,完全可以自己编写。...何为Recordset对象Connection对象,Connection对象是与数据源连接,Recordset对象是操作数据。...,计数器复位Public Sub DBapi_Disconnect()  Connect_Num = 0  DisconnectEnd Sub '执行数据库操作语言'byval 就是按参数传递,再传递过程...,参数不会发生变化(也就是将参数值而不是将地址传递给过程方式,这就使过程访问发哦变量副本,过程不可改变变量值);与之对应byref,指按参数地址传值,byref可以省略Public Sub

    3.4K10

    一起学Excel专业开发26:使用类模块创建对象5

    类模块引发事件分两步: 1.类模块声明事件 2.使用RaiseEvent引发该事件 下面是修改后CCells类模块代码: '创建枚举常量 Public Enum anlCellType...类CCell类之间显示地建立了父子关系现在,所以枚举型常量anlCellType声明父类集合类模块CCells。...CCells类,声明了一个名为ChangeColor事件,包含两个参数:第一个参数uCellType接受需要进行更改单元格类型,第二个参数bColorOn指定是否进行颜色转换。...对BeforeDoubleClick事件BeforeRightClick事件进行了修改,使之能够引发新事件,并传递给ChangeColor事件目标单元格类型指定颜色开或关布尔值。...使用《一起学Excel专业开发25:使用类模块创建对象4》中介绍方法,CCell类模块捕获Cells对象所引发事件。

    69330

    Go语言指针 & *

    Go语言保留着C中值指针区别,但是对于指针繁琐用法进行了大量简化,引入引用概念。所以Go语言中,你几乎不用担心会因为直接操作内寸而引起各式各样错误。...Go语言指针,基本上只剩下用于区分 byref byval 语义。 运算符就是简单 & * 一个取地址、一个解析地址。 ?...1:1 2:0 3:2 4:2 传值与传指针 当我们传一个参数值到被调用函数里面时,实际上是传了这个值一份copy,当在被调用函数修改参数时候,调用函数相应实参不会发生任何变化,因为数值变化只作用在...传指针比较轻量级 (8bytes),只是传内存地址,我们可以用指针传递体积大结构体。如果用参数传递的话, 每次copy上面就会花费相对较多系统开销(内存时间)。...(注:若函数需改变slice长度,则仍需要取地址传递指针) 要访问指针 p 指向结构体某个元素 x,不需要显式地使用 * 运算,可以直接 p.x ; ?

    67350

    一起学Excel专业开发06:Excel应用程序开发一些好做法

    进行Excel应用程序开发时,如果遵循一些好做法,将会极大地增强程序可读性、可理解性、可维护性复用性。 代码注释 良好代码注释是Excel应用程序开发中非常重要原则之一。...位于模块开始部分,简要描述模块中代码目的。 2.过程级注释。通常放置于每个过程名上方或者过程第一行语句上方,说明过程目的、注意事项、参数意义作用、函数返回值说明、过程修改时间内容等。...2.同一代码段,对齐代码行之间往往是并列关系,而缩进则用于表明代码行之间逻辑结构关系。 3.合理使用代码连接符(即英文下划线_),可以多行显示较长语句。...2.如果想隐藏模块过程,使用户接口或其他Excel工程不能使用模块过程,则可以模块顶部使用Option Private Module语句声明。...2.声明过程参数时,显式使用ByRefByVal。 3.使用前验证过程参数有效性。 4.显示调用对象默认属性。 5.经常使用菜单“调试-编译”命令。

    80030

    VBA函数与过程简洁教程

    'VBA函数与过程简洁教程 Sub 过程名() 'Sub表示过程,执行宏或图形右击指定宏中看得到,不能返回值 Call 函数名(Array(1, 2), b) '调用过程并把返回值放入r End Sub...'结束过程 Function 函数名(a, Optional ByVal b) 'Function表示函数,单元格也可以使用,宏列表看不到,可以使宏列表简洁 'VBA默认ByRef会改变原参数值...,所以加了ByVal If IsMissing(b) Then b = 1 'Optional表示参数可以选择性省略,上面的语句是如果没有时设定值,常用设定可选来灵活调试,如果有一个非可选就不能直接运行...定义可变数组,UBound()是求最大下标值 arr(1) = b 函数名 = arr '返回值,仅Function可用 Exit Function '退出函数,不要用return,return是一个程序回到

    97630

    VBA专题10-21:使用VBA操控Excel界面之禁用启用控件、组选项卡

    被禁用控件功能区显示是灰色。...ThisWorkbook模块SheetActivate事件处理代码: Private Sub Workbook_SheetActivate(ByVal Sh As Object) 'Excel...Custom UI Editor中保存该文件,首次Excel打开该文件时,将会出现关于InitializeGetEnabledAttnSh过程提示错误消息,因为标准VBA模块仍然没有这两个回调过程...End Sub 要基于其XML代码id禁用(启用)某自定义控件,现有的标准VBA模块或者新标准VBA模块包括下面的代码: Sub EnableAll() Call RefreshRibbon...是否启用(或禁用)某控件取决于RefreshRibbon参数传递值。一旦使这些控件无效,就调用GetEnabledAttnSh过程,遍历共享这个相同回调所有无效控件。

    3.3K20

    过程(五)可选参数可变参数

    大家好,上节介绍了过程传递参数时,形参与实参结合两种方式,传地址传值。本节将介绍可选参数可变参数。...vba过程,通过形参前面加上Optional关键字来设置该形参为可选参数,在过程内部通过使用ismissing函数可测试调用程序是否传递了可选参数。...---- 二、可变参数 上面介绍可选参数时,可以发现在定义过程时,不管是固定参数还是可选参数,都已经制定了参数个数,那么VBA还可以定义可变参数,即参数个数定义时时未知。...调用时,参数传递参数i地址传递给sum1子过程形参t,将后面1,2,3,4,5,6作为一个数组传递给intnum()数组。子过程中计算数组中所有元素。...需要注意是ParamArray只能用于参数列表最后一个参数,指明最后这个参数是一个Variant变体型变量元素Optional数组,ParamArray关键字不能ByValByRef或Optional

    4.7K20

    实现用VB.Net(C#)开发K3 BOS 插件真正可行方法

    、C#)开发DLL是跑.net CLR上中间二进制字节码以及其他一些有自描述功能元数据组成,它不符合COM+规范,金蝶K/3及BOS都是用VB6开发而来,EAS那就另当别论了,所以BOS插件说白了也是...VB6调用符合COM规范DLL,它原理就是原程序里(宿主)先导入放在BOS插件上dll然后直接Byref调用Public Sub Show(Byval XXX as Object) 来把需要编程对象传递过来...2、   .NET强名strong name 说白了就是为了保护你组件不被破坏,.Net开发dll想给像com那样被调用那就必须加个强名(数字签名) ’---------------------...2,进去后菜单 [项目]>>[添加引用] 处添加 K3ClassEvents.dll 组件(VB6一样要添加它)如:图2.1                                                        ...图 2.1 3,以net方式规范编写代码,具体可参考BOS资料VB6工具栏插件生成代码稍作修改作为骨架码

    1.4K10

    一起学Excel专业开发23:使用类模块创建对象2

    集合对象是VBA提供内置对象,可用来保存对象和数据。集合对象对于存放在其中数据类型没有任何限制,不同类型数据也可以存放在同一个集合对象。...= gcolCells(“$A$3”) ‘访问集合关键字为$A$3元素 我们可以控制添加到集合对象类型,也可以集合添加一些新方法,例如,使用一个方法来高亮显示相同类型单元格,再用另一个方法来取消这些高亮显示...由于集合对象对于外部是不可见,因此编写自已Add方法,并且还创建CountItem属性过程用于表示集合对应属性。...Highlight方法通过循环语句遍历集合每个成员,如果CCell对象CellType属性参数uCellType指定类型值相同,则执行CCell对象Highlight方法。...同理,UnHighlight方法通过循环语句遍历集合每个成员,如果CCell对象CellType属性参数uCellType指定类型值相同,则执行CCell对象UnHighlight方法。

    1.2K20
    领券