Sub 与没有返回值的函数

2023-11-23

子程序的意义是什么(Sub)?为什么不使用一个Function没有返回值?


Edit

我的意思是,为什么关键字Sub存在?我可以用Function没有声明返回值并具有相同的,不是吗?


因为它澄清了intent.

A Function明确地说“我回来后会给你一些东西”。这期待那是一个Function返回一些东西,因为这就是函数的用途.

A Sub明确地说“我是做某事你应该期望最终会成功”。期待那是一个Sub执行一个动作,改变一些状态,引起一些副作用。

A Function那将被命名为DoSomething,就像一个令人困惑的Sub那将被命名为GetFoo: the intent是模糊的,该程序的本质与它的广告方式相冲突。我预计DoSomething要么成功做某事,或者抛出一些错误。同样,我期望GetFoo到,嗯,给我一个Foo.


因为非返回函数没有任何意义。

在多种编程语言中,Function(或语义上相似的构造)不在所有代码路径中返回值,甚至无法编译。用一个无返回值函数VBA 中的所有内容听起来都非常像滥用语言,只是因为 VBA 不会抱怨它。正如常识告诉我们的那样,这并不是因为我们can,我们should.

为何返回void,当你可以返回bool到处都是,而不分配它?

public bool DoSomething()
{
    // do stuff...
    // ...and don't assign the return value.
    // woopsie, doesn't compile.
}

A VBA Sub程序就像C#void方法:是explicit关于它的不回归性质,这是一件好事。


因为静态代码分析工具会抱怨。

众所周知,VBA 编译器不会关心您是否编写了无法明确不返回隐式返回值是否是有意的代码。

当你do意味着返回一个值 - 并且忘记了,因为错误一直在发生 - 如何 你能确定吗this one合法不返回,并且另一个不是吗?没有梳理代码并完全理解它所做的一切and why,你无法分辨。如果你幸运的话,你会看到一些小的、专门的函数,它们显然只做一件事,而且做得很好。否则,您需要浪费时间来了解正在发生的事情,只是为了确定一些本来应该是显而易见的事情.

静态代码分析工具,例如橡皮鸭(我维护该项目)将标记这些功能,因为它们是潜在的错误隐藏在你的代码库中,等着咬你:

Rubberduck code inspection results

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sub 与没有返回值的函数 的相关文章

  • vba - 扫描文档中的宏并替换宏文本?

    我面临一个谜题 我工作的地方有大量的 Word 模板 它们都包含一个包含一些错误的自动新建事件句柄 这个错误存在于所有模板中 我想知道是否有一种方法可以扫描包含此宏的模板的目录并稍微更改宏代码 这可能吗 是的 你可以这么做 您可以使用以下方
  • 将单元格背景颜色设置为其包含的 RGB 值。如何?

    下面是我希望通过手动复制和粘贴以外的方式实现的屏幕截图 这是材料设计调色板 在 Excel 中看起来很棒 如何循环遍历范围 B2 B15 并将每个单元格背景颜色设置为其相应的包含颜色 也许是一个VBA loop去经历垂直 B 单元格范围 解
  • 将 PDFMaker 与 MS Outlook 结合使用

    我想将 Adob e PDFMaker 插件与 MS Outlook 2013 一起使用 使用 PDFMAKER 将多封电子邮件保存为 pdf https stackoverflow com questions 44723984 savin
  • Excel 公式或 VBA:在具有 2 列条件的单独表中查找匹配的地址 - 无辅助列

    我需要公式结构方面的帮助 我有2张桌子 我想找到 a 列和 b 列相等的匹配项并获取表 2 中的地址 它们将是唯一的条目 例如 项目信息表 A B C 1 Name Company Project 2 Chris Evans Apple I
  • 在没有加载项的情况下加载 Excel

    All 我编写了一个电子表格应用程序 用户通过双击我提供的图标来加载它 问题是用户有很多插件 这会降低 Excel 的速度 如何使用命令行开关加载 Excel 来禁用所有加载项 该问题适用于 Excel 2003 和 Excel 2007
  • 如何通过VBA代码修复仅在Excel共享模式下发生的运行时错误400

    我真的不知道400错误是什么原因造成的 下面的代码在正常模式下运行得很好 但是一旦我在共享模式下启用 Excel 并尝试使用用户表单 它就会给我 VBA 400 我在这里尝试做的是在向用户显示用户表单后更改形状的文本并禁用其 OnActio
  • VBA C# DLL 未注册

    我制作了一个 C NET dll 我想从 VBA 运行它而不注册它 我找到了解决方案there https stackoverflow com a 13333819并且它可以完美工作 但前提是程序集是使用 Framework NET 3 5
  • 从嵌入的谷歌地图中提取标记坐标

    对此还很陌生 所以请耐心等待 我需要从嵌入的谷歌地图中提取标记坐标 示例链接是http www picknpay co za store search http www picknpay co za store search我想提取搜索时地
  • 如何暂停特定时间? (Excel/VBA)

    我有一个 Excel 工作表 其中包含以下宏 我想每秒循环一次 但如果我能找到执行此操作的函数 那就很危险了 难道不可能吗 Sub Macro1 Macro1 Macro Do Calculate Here I want to wait f
  • Excel VBA 用户窗体 - 当发生变化时执行 Sub

    我有一个包含很多文本框的用户表单 当这些文本框的值发生变化时 我需要通过调用子例程 AutoCalc 根据文本框值重新计算最终结果值 我有大约 25 个框 我不想向每个调用上述子例程的文本框单独添加 Change 事件 当某些值发生变化时调
  • 打开 Excel 工作簿时自动运行 VBA 代码

    我有 VBA 代码 我想在打开 Excel 工作簿时运行 我尝试在代码应该运行的工作表中创建一个公共过程 Public Sub Workbook Open Some code here End Sub 工作簿打开时它不会运行 它应该在其中一
  • 如何从 Outlook 的“收件人”字段中提取电子邮件地址?

    我在某种程度上一直在使用 VBA 使用以下代码 Sub ExtractEmail Dim OlApp As Outlook Application Dim Mailobject As Object Dim Email As String D
  • 消除多个 Elseif 语句

    我试图保持我的代码干净 特别是在用户表单中使用组合框 可能会有很多 if Elseif 语句 应该有一种更简单的方法 让一个组合框不再需要多页代码 是吗 现在如何完成的示例 Sub Example Dim Variable as Strin
  • 正在使用的 VBA 监视文件

    我正在寻找一些东西 Win API 调用或其他 来在文件可供编辑 即不再使用 时通知我 我应该设置一个计时器来按一定时间间隔检查文件还是有一个好方法对文件设置监视 FileSystemWatcher 没有帮助 Win32 FindFirst
  • VBA 写入文件时对数值进行四舍五入 - 如何防止?

    在下面的代码中 我在确保文件编写器不会将我的数字四舍五入到一定的小数位数时遇到问题 我需要使用变体 因为有时该值是字符串 有时它是数字 我怎样才能强制它准确地写出变量是什么 例如 下面的代码可能显示 0 00038 我想显示确切的值 Dim
  • VBA删除列中的单元格并根据单元格的值左移?

    如果单元格为空 如何删除 B 列 和左移 中的单元格 下面是我所拥有的 但它给出了 应用程序定义或对象定义的错误 Sub DeleteCellShiftLeft For i 1000 To 1 Step 1 If Cells i B Val
  • 如何确保我的 IE 选项卡名称正确?

    我使用此代码从 Word VBA 获取 Internet Explorer 的实例 并从网页中抓取一些值 我循环遍历 4 个项目 以防万一 有时我不小心抓住了一个名为 Windows Explorer 的东西 我不知道那是什么 来抓住 In
  • 如果单元格 = 0,则将范围复制到主表并从主表中删除范围

    有 10 个工作表 工作表 1 工作表 10 其表处于相同范围 C25 G34 和 C42 N51 如果 总重量 列的值 gt 0 则必须复制这些行 复制的行将转到两个汇总表 前往 Westrock 表 gt Westrock 汇总表 前往
  • 如何从特定类获取特定链接?

    我想提取这个href从那个特定的class tr class even td a href italy serie a 2015 2016 Serie A 2015 2016 a td 这是我写的 Sub ExtractHrefClass
  • VBA MS-Word:是否可以用通配符替换文本?

    是否可以替换使用通配符找到的文本并将其也替换为通配符 例如FindText 13 2 13 Forward True MatchWildcards True 然后用这样的通配符替换它replacewith 13 2 11 是否可以 评论中的

随机推荐

  • 验证失败时防止焦点集中在字段上

    我经常使用这个 jQuery 验证插件验证表单 效果很好 真的很满意 但是当您在表单上按 提交 时 它会自动将焦点放在无效的字段上 在我当前的项目中 我有一个非常长的表单 当您按下提交按钮时 您的滚动条会跳到该字段 可能是因为它获得焦点 但
  • 在 C# 中,如何在运行时检查对象是否属于某种类型?

    在 C 中 如何在运行时检查对象是否属于某种类型 您可以使用is关键词 例如 using System class CApp public static void Main string s fred long i 10 Console W
  • 如何在Excel中过滤多个条件?

    我正在尝试过滤多个条件 但我看到 过滤器 选项只有 2 个 AND OR 选项字段 我有一个充满链接的专栏 我想提取其中包含这些的所有行 pdf doc docx xls xlsx rtf TXT csv pps 有没有好的方法可以做到这一
  • Java读取wav文件

    我想用 Java 读取 wav 文件 并且将使用 K means 对它们进行分类 我怎样才能读取Java中的wav文件并将它们分配到一个数组或类似的东西 你可以建议它的想法 来对它们进行分类 EDIT 我想使用 API 来读取 wav 文件
  • 如何像 UNIX 中的 tar 一样在 Perl 中归档目录?

    我想归档一个目录 我不知道是否可以调用 我想压缩一个目录 我想在解压时保留另一端的访问权限 我应该用 perl 解决这个问题 感谢您的回复 但我为什么要求使用 Perl 来做到这一点是因为我希望它独立于平台 我想将一个大文件传输到多台机器
  • 如何克隆到非空目录?

    我有目录 A 和与目录 B 匹配的文件 目录 A 可能还有其他需要的文件 目录 B 是一个 git 存储库 我想将目录 B 克隆到目录 A 但 git clone 不允许我这样做 因为该目录非空 我希望它只是克隆 git 并且因为所有文件都
  • 如何使用 python 将 wav 实时转换为 mp3?

    我有如下所示的代码来从麦克风获取音频 import pyaudio p pyaudio PyAudio CHUNK 1024 FORMAT pyaudio paInt16 CHANNELS 2 RATE 1024 10 RECORD SEC
  • 范围最小查询 方法(从树到受限 RMQ)

    所以 我读了thisTopCoder 关于 RMQ 范围最小查询 的教程 我有一个很大的问题 在他介绍的部分方法 到目前为止我能理解的是 整个方法实际上使用了中介绍的方法稀疏表 ST 算法 从 LCA 减少到 RMQ and 从 RMQ 到
  • Win32 中本机 C/C++ 的高级 HTTP 客户端库

    Win32 中是否没有用于本机 C C 的 高级 HTTP 库 或者我只是找错了地方 我所说的 高级 是指一个 API 它允许我使用与 NET 框架 大致相同 的抽象级别在 C 中执行 HTTP Web 请求 响应 但请注意 使用 C CL
  • FontAwesome 图标在反应/下一个应用程序中无法正常工作

    已解决 TLDR 添加import fortawesome fontawesome svg core styles css 到 app js index js 文件修复了该问题 并且 FontAwesome 按预期工作 我的问题是由npx
  • delete[]等于删除吗? [复制]

    这个问题在这里已经有答案了 IP ADAPTER INFO ptr new IP ADAPTER INFO 100 如果我免费使用 delete ptr 会导致内存泄漏吗 如果不会的话为什么 这是VS2005生成的反汇编代码 delete
  • GitHub Actions 的工作流程中是否可以有动态策略矩阵?

    我想在工作流程中动态指定策略矩阵 所以 而不是 strategy matrix foo bar baz 我想首先调用一些脚本来计算并返回一个数组 例如 bar baz 对我来说 然后我想用它作为策略矩阵 这可能吗 使用可用的 GitHub
  • AppCompat v7 工具栏向上/后退箭头不起作用

    我的活动中有两个片段 当片段 A 显示时 我希望显示抽屉式导航汉堡图标并且抽屉式导航能够工作 当片段 B 显示时 我希望显示后退箭头 并在单击它时进行向上导航 但是 除非导航抽屉打开 否则我似乎无法让新的 AppCompat v7 工具栏在
  • 如何在pyCharm中进行单元测试

    我想做一些单元测试 所以我设置了一个列表 其中所有值都应断言为 true 就像这个问题 但我想让它跑进去PyCharm 按Alt Shift F10 如果我只使用答案中的代码 我就会得到No tests were found 您需要仔细检查
  • 如何检测 Java 字符串中的日文文本?

    我需要能够检测 Java 字符串中的日语字符 目前 我正在获取 UnicodeBlock 并检查它是否等于Character UnicodeBlock KATAKANA 或Character UnicodeBlock HALFWIDTH A
  • Android 对话框中的非法参数异常

    我正在使用此代码来显示警报对话框 当我单击 确定 按钮时 它应该显示日期选择器 protected Dialog onCreateDialog int id switch id case TIME DIALOG ID return new
  • 将 byte[] 转换为 float[] 时出现 UnsupportedOperationException

    我试图通过将 byte 放入 ByteBuffer 中 将 byte 转换为 float 将其转换为 FloatBuffer asFloatBuffer 然后将其转换为数组 private static float toFloatArray
  • 如何在 MS SQL Server 上模拟 Oracle 物化视图?

    连接到 MS SQL Server 的应用程序将创建视图 其中单行结果是包括 1 10k 记录聚合的分析 结果视图中的适用标准将有数十到数万个结果 然后 视图 条件将按视图中最有可能是聚合列的某些列 用户指定 进行排序 当使用聚合列进行排序
  • Dart/Flutter :日期范围内的天数列表

    我需要从日期范围中检索天数列表 用户选择开始日期和结束日期 并计算之间的天数 包括开始和结束日期 我尝试使用 for 循环 如下所示 List
  • Sub 与没有返回值的函数

    子程序的意义是什么 Sub 为什么不使用一个Function没有返回值 Edit 我的意思是 为什么关键字Sub存在 我可以用Function没有声明返回值并具有相同的 不是吗 因为它澄清了intent A Function明确地说 我回来