讨论一个问题:如何避免 Set ,兼散分。

fj182 2008-12-09 12:00:17
VB6 的 Set 语句用于引用类型赋值,可是有些时候我们并不知道一个变量或者表达式是值类型还是引用类型,如:

' 一个实现未知的函数
Public function SomeMethod() as Variant

要调用这个函数并获得返回值,需要做一次判断,如:

Dim var as variant

If IsObject(SomeMethod()) then
Set var = SomeMethod()
else
var = SomeMethod()
end if

这里调用了两次函数,不合理,可以改良一下:

' 增加一辅助方法来处理
public sub pSetValue(varIn,varOut)
if IsObject(varIn) then
set varOut = varIn
else
varOut = varIn
end if
end sub

' 调用
dim var as variant

pSetValue SomeMethod(),var

虽然做了优化,还是免不了要判断,总感觉不太完美,后来又找到一个新的办法,用API:

Private Declare Sub VariantCopy Lib "oleaut32" (pvargDest As Variant, pvargSrc As Variant)

dim var as variant

VariantCopy var,SomeMethod()

这下不用判断了,却引入了一个外部的API,觉得不是最好的,不知道诸位大虾们有何高见?
虽然现在不怎么用VB6了,还是对它念念不忘。
...全文
220 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzyong00 2008-12-12
  • 打赏
  • 举报
回复
如果是自己的程序,在设计应明确返回的类型
如:Public function SomeMethod(ret as Variant ) as long
像window API,很少返回不明确的类型甚至复杂类型!

调用时:
dim ret,retType as long
retType=SomeMethod(ret)
if retType=... then
set obj=ret
elseif retType=... then
var=ret
endif
Tiger_Zhao 2008-12-12
  • 打赏
  • 举报
回复
一个未知功能的方法是不具有可用性的。

你在考虑调用某个方法的前提是你知道它实现什么功能,而你恰恰需要这个功能,才会调用它。
功能确定后,返回值也确定下来:仅值类型/仅对象/值或对象。最后一种情况是功能的需要,那么进行IsObject()判断是必须的。
  • 打赏
  • 举报
回复
坚决顶,我也觉得还是用set这种方法比较方便.
josephSC 2008-12-11
  • 打赏
  • 举报
回复
jf~
fj182 2008-12-11
  • 打赏
  • 举报
回复
不是COM的问题,可能是VB的设计者希望在代码上能体现出值类型跟引用类型的区别,我不太喜欢这种机制。

可能有人认为这是个无聊且没有意义的问题,请考虑以下几种情况:
1、用第三方的库,未说明方法的返回类型。
2、用晚期绑定调用某个方法,对象及方法都可能是动态的,未知返回类型。
3、如果在应用程序中提供脚本环境,可以让用户编写自己的函数(类似于Office里面的宏),我们没办法预测到用户要返回什么。

第一种情况,我们可以在开发阶段去尝试获取返回类型,另外两种就不可知了。
yangao 2008-12-11
  • 打赏
  • 举报
回复
影响不了太多~
Tiger_Zhao 2008-12-11
  • 打赏
  • 举报
回复
变量到底是对象类型还是值类型在程序中应该是很清楚的,否则就是设计的问题了。

对你来说最好是不用 COM —— 那就等于不用 VB。
roadblossom 2008-12-10
  • 打赏
  • 举报
回复
问题的不会
jiang_jiajia10 2008-12-10
  • 打赏
  • 举报
回复
UP
zuoxingyu 2008-12-10
  • 打赏
  • 举报
回复
都是variant 类型惹的祸。。。

IF判断对程序运行的效率会有多少影响啊??
zhufenghappy 2008-12-10
  • 打赏
  • 举报
回复
是对象你就用set呗,为什么不用阿。
csgdseed 2008-12-10
  • 打赏
  • 举报
回复
帮顶
fj182 2008-12-09
  • 打赏
  • 举报
回复
VariantCopy 是 OLE 底层的函数,VB本身也会去调它。
SYSSZ 2008-12-09
  • 打赏
  • 举报
回复
还是直接用set语句调用,前面加 on error goto
神马都能聊 2008-12-09
  • 打赏
  • 举报
回复
这个代码有一定风险啊..两次和一次的概念完全不一样啊..

If IsObject(SomeMethod()) then
Set var = SomeMethod()
else
var = SomeMethod()
end if

我现在用的都是这种方法,但是参数还是引用,而且效率较慢.

public sub pSetValue(varIn,varOut)
if IsObject(varIn) then
set varOut = varIn
else
varOut = varIn
end if
end sub

引入API的方式,老大说不好,最好别用(不知道为啥 - -),可能是可移植性???
Private Declare Sub VariantCopy Lib "oleaut32" (pvargDest As Variant, pvargSrc As Variant) 

dim var as variant

VariantCopy var,SomeMethod()

zdingyun 2008-12-09
  • 打赏
  • 举报
回复
关注!DING!
清海扬波 2008-12-09
  • 打赏
  • 举报
回复
JF
感觉还是set比较方便,毕竟大家都是这样用,也方便后期代码维护,
不然可能不好读,API还没有用过,不过也是一种方法.
fj182 2008-12-09
  • 打赏
  • 举报
回复
能不用 Variant 最好,不过很多时候都没办法知道类型的。
熊孩子开学喽 2008-12-09
  • 打赏
  • 举报
回复
最好的办法就是不用Variant类型.这不是个什么好东西.
clear_zero 2008-12-09
  • 打赏
  • 举报
回复
我选if else +set

代码的可读性加强了,效率并没有损失多少。毕竟多人开发代码的规范和可读性对比本例所损失的效率来说更加重要
加载更多回复(6)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧