正在使用“out”不好的做法

2023-11-24

我刚刚添加了一个outbool 参数到我编写的方法中,以便在我的 UI 中收到警告。我使用了 out 而不是让方法本身返回 false/true,因为这意味着做一点事失败/成功。我的想法是warnUser将指示警告实际上是什么,而无需查看该方法的实现。

原始代码

public void DoSomething(int id, string input);

New Code

public void DoSomething(int id, string input, out bool warnUser);

我正在使用 Moq 来测试此代码,但它不支持 out/ref 参数,因为 Lambda 表达式不支持它们

测试代码

mockService.Verify(It.IsAny<int>(), It.IsAny<string>(), It.IsAny<bool>());

所以,正在使用out参数不好的做法,如果是这样我该怎么办?


在 void 方法中使用 out 参数通常是一个坏主意。你说你已经使用它“而不是让方法本身返回 false/true,因为这意味着 DoSomething 失败/成功” - 我不相信存在这种暗示。通常在 .NET 中,失败是通过异常而不是真/假来指示的。

out参数通常比返回值使用起来更难看 - 特别是,你必须有一个正确类型的变量来处理,所以你不能只写:

if (DoSomething(...))
{
   // Warn user here
}

您可能需要考虑的一种替代方案是指示所需警告级别的枚举。例如:

public enum WarningLevel
{
    NoWarningRequired,
    WarnUser
}

然后该方法可以返回一个WarningLevel代替bool。这会让你的意思更清楚——尽管你可能想稍微重命名一些东西。 (很难用诸如“DoSomething”之类的元语法名称提供建议,尽管我完全理解你为什么在这里使用它。)

当然,另一种选择是您可能希望显示更多信息 - 例如reason为了警告。这可以通过枚举来完成,或者您可能想完全给出一些更丰富的结果。

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

正在使用“out”不好的做法 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 如何使用 LAMBDA 表达式在 LINQ 中执行 IN 或 CONTAINS?

    我有以下 Transact Sql 我正在尝试将其转换为 LINQ 并且很挣扎 SELECT FROM Project WHERE Project ProjectId IN SELECT ProjectId FROM ProjectMemb
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 重载<<的返回值

    include
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • Django:“模块”对象没有属性“索引”

    过去几天我一直在尝试学习 Django 但最近我偶然发现了一个我似乎无法解决的问题 在完成 Django 自己的关于编写第一个应用程序的教程后 我决定再次阅读它 直到现在 我才会替换所有内容 以满足我正在构建的原始应用程序的要求 所以 一切
  • spring-boot 应用程序的嵌入式 Tomcat 目录列表

    我有一个带有嵌入式 Tomcat 的 Spring Boot 应用程序 我想通过 tomcat 目录列表从不同位置公开一些图像文件和文件夹 所以我在我的配置文件中添加了以下内容 public class AppConfig extends
  • 在 iOS 设备上运行网络服务器

    我想创建一个可以在其他 iOS 设备之间共享文件的应用程序 也可以在桌面计算机之间共享文件 所以我想做的是在我的设备上运行一个轻量级 Web 服务器 允许从设备下载文件 如下所示 http myphone local 1234 folder
  • 如何在 C# 中证明方法永远不会返回 null(按合同设计)

    我有一个永远不会返回空对象的方法 我想澄清一下 这样我的 API 的用户就不必编写如下代码 if Getxyz null do stuff 我该如何表达这个意图 不幸的是 没有办法内置到 C 中 您可以记录这一事实 但这不会被自动检查 如果
  • 桌面版 flutter,Visual Studio 2022 问题

    当我尝试在 Windows 上运行 flutter 应用程序时收到此消息 Building Windows application CMake Error at CMakeLists txt 2 project Generator Visu
  • Couchdb数据库-每用户设计文档管理

    我正在评估 Couchdb 作为一个有很多用户的 Web 应用程序 如果我使用每用户数据库模型 想必每个数据库中的设计文档都是相同的 我没有发现任何提及作用于多个数据库的 全局 设计文档 或任何可以轻松更改所有用户数据库的设计文档的工具 这
  • 在 C 中创建数组

    我正在尝试用 C 创建一个 UNIX shell 如果是用 Java 那将是小菜一碟 但我对 C 没有那么丰富的经验 C 中的数组让我有点困惑 我不确定如何声明或访问某些数据结构 我想创建一个字符串来在每一行中读取 很简单 只是一个字符数组
  • 自定义按键绑定 Xcode 4?

    不久前我问了一个问题Xcode 中的自定义键绑定 我最终重新创建了一些TextMate 的按键命令在 Xcode 中 刚刚更新到 Xcode 4 PBKeyBinding 文件似乎不再有任何作用 自定义键绑定 特别是 Xcode 4 的新热
  • Windows Server 2012 中的 AWS EFS [已关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 有人曾经让 Windows Server 使用 Windows NFS 4 1 客户端连接到 AWS EFS 卷吗 我知道它不受支持 但想知道是否有人做过 或通过其他客户端或实用程序
  • 从另一个类调用类方法

    有没有办法从另一个类调用一个类的方法 我正在寻找类似 PHP 的东西call user func array 这是我想要发生的事情 class A def method1 arg1 arg2 class B A method1 1 2 更新
  • 解释 Visual Studio 2010 及更高版本、WinForms 和 WPF 中的严重错误

    尝试将以下代码放入其中LoadWinForms 的事件处理程序或Loaded对于 WPF Dim doc As New XmlDocument Dim nsmgr As New XmlNamespaceManager Nothing thi
  • jquery tmpl 格式化日期?

    我正在使用 jquery tmpl 在表中显示一堆结果 其中之一是我在模板中使用它输出的日期 td class textAlignRight EffectiveDate td 但它的格式如 Date 1245398693390 我怎样才能改
  • 在 r 中读取大文本文件

    我想读取一个包含 110 000 000 行和 8 列的大型视频文件 这些列由 2 个整数列和 6 个逻辑列组成 分隔符 在文件中使用 我尝试使用read big matrix这花了很长时间 我也尝试过dumpDf并且内存不足 我试过ff我
  • Safari 对子像素计算进行舍入

    我有一个连续占用 829px 的容器 并且具有相同大小的背景图像 我在该容器中有一个 div 它根据 829px 容器计算其宽度 在 safari 上 div 宽度约为 173 8px 但由于 safari webkit 向下舍入 其宽度被
  • 如何使用 node.js 响应传入的 Twilio 呼叫和 SMS 消息?

    在我的应用程序中 我使用 twilio node js 模块来接收短信 发送短信 接听电话和拨打电话 我弄清楚了如何发送短信和拨打电话 但我不知道如何回复来电和短信 我如何使用节点来响应这些 当 Twilio 收到对您的电话号码的呼叫时 它
  • 如何将 Jackson mixin 添加到阅读器而不是对象映射器?

    我有一个对象 我想在程序的一部分中使用属性进行序列化 但在不同的部分中没有属性 我还有一个经过广泛定制的 ObjectMapper 用于两种序列化 我的第一个倾向是使用 Mixin 来调整是否显示属性 但似乎您只能将它们放在 ObjectM
  • 运行gradle任务时如何在命令行中传递多个参数?

    我有一个由 gradle 任务运行的 java 和 groovy 类 我已设法使其工作 但我不喜欢在命令行中传递参数的方式 这是我目前通过命令行执行此操作的方法 gradle runTask Pmode doStuff username p
  • Java FileLock 是 POSIX Advisory (fcntl) 锁吗

    我有一个使用 POSIX 咨询锁锁定文件的 C 程序 也就是说 它使用POSIX fcntl系统调用用于锁定操作 我希望 Java 程序能够与 C 程序进行互操作 因此我希望我的 Java 程序也使用 POSIX 咨询锁 Java 中的文件
  • 使用 jQuery .on() 绑定到准备就绪并同时调整大小

    这适用于在就绪和调整大小时运行相同的代码 document ready function window resize function Stuff in here happens on ready and resize resize Tri
  • 正在使用“out”不好的做法

    我刚刚添加了一个outbool 参数到我编写的方法中 以便在我的 UI 中收到警告 我使用了 out 而不是让方法本身返回 false true 因为这意味着做一点事失败 成功 我的想法是warnUser将指示警告实际上是什么 而无需查看该