检查方法参数的最佳方法是什么? [关闭]

2024-01-06

我知道两种方法来检查方法的参数并在需要时抛出异常。

1)对每个参数进行检查,错误时抛出异常:

public void Method(object parameter1, object parameter2)
{
    if (parameter1 == null)
    {
        throw new ArgumentNullException("parameter1");
    }

    if (parameter2 == null)
    {
        throw new ArgumentNullException("parameter2");
    }

    ...
}

2) 立即检查所有参数并为所有参数抛出相同的异常:

public void Method(object parameter1, object parameter2)
{
    if (parameter1 == null || parameter2 == null)
    {
        throw new ArgumentNullException();
    }

    ...
}

在我看来,第一种方法更好、更干净,但也涵盖了很多线条。例如,一个方法实际上执行了 2 行代码 - 这样,每个参数的代码将增加 4 行(包括空行)。

我感兴趣的是经验丰富的程序员使用的方法。还有比这两种更好的方法吗?


2020 年 7 月更新

查看这篇博客文章,了解如何实现类似的代码契约方法。

https://enterprisecraftsmanship.com/posts/code-contracts-vs-input-validation/ https://enterprisecraftsmanship.com/posts/code-contracts-vs-input-validation/

原始答案如下

—-

如果您使用 .NET Framework 4,请查看代码合约 http://msdn.microsoft.com/en-us/devlabs/dd491992,将其简化为一行代码

public string Reverse(string text)
{
   Contract.Requires<ArgumentNullException>(text!=null, "ParAmeter cannot be null.");
  
   .....
}

您使用它的原因是因为您现在可以获得自动化工具,例如Pex http://research.microsoft.com/en-us/projects/pex/告诉您对此方法应用哪些单元测试。如果此方法根据您的调用方式抛出异常,它还会在编译时向您提供反馈。喜欢

String text = null;
String reversedString = Reverse(text);

编译器会警告您这将引发异常。

注意代码合同需要安装插件,但它是免费的。

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

检查方法参数的最佳方法是什么? [关闭] 的相关文章

随机推荐

  • 使用 php 发送带有附件的电子邮件

    我使用此代码使用 php 发送带有附件的电子邮件 但附件中存在一些错误 因为我收到了一封电子邮件并且附件出现在内容中 在我使用相同的代码并成功运行之前 为什么
  • 理解 Rust 中的线程安全 RwLock> 机制

    背景 I am 全新的Rust 昨天开始 我试图确保我理解正确 我正在寻找为 游戏 编写一个配置系统 并希望它能够快速访问但偶尔可变 首先 我想研究本地化 这似乎是静态配置的合理用例 因为我意识到这些东西通常不会 生锈 我想出了以下 工作
  • django ModelMultipleChoiceField 设置初始值

    我有以下代码 category forms ModelMultipleChoiceField label Category queryset Category objects order by name widget forms Selec
  • 有没有地方可以在一处获取 laravel `vendor` 文件夹?

    我意识到这就是作曲家的用途 但我不是特别喜欢它 这是有道理的 但让我恼火的是 laravel5 的 github 不能开箱即用 因为它是vendor目录有点大 不一定是 laravel5 尽管 laravel 确实需要它 我也很困惑为什么作
  • 如何在 Intellij IDEA 运行之前启用 Hibernate 字节码检测?

    在 gradle 中你可以使用以下方法来实现 apply plugin enhance buildscript repositories mavenCentral dependencies classpath org hibernate h
  • 删除动态数组的一部分并增加其他部分

    我需要一个动态数组 因此我需要通过指针分配必要的内存量 让我想知道哪个是一个好的解决方案 是 C 能够执行以下操作 int p new int 6 它分配必要的数组 我需要的是 之后我想增加这个数组的一些部分 一个 有缺陷的 例子 int
  • 代理网络充斥着未使用的 ActiveMQ.Advisory.TempQueue 消息

    我目前正在调查我的经纪商网络中的内存问题 根据 JConsole 的说法 当代理开始阻止消息时 ActiveMQ Advisory TempQueue 占用了 99 的配置内存 有关配置的一些细节 大部分情况下都是默认配置 一个开放的 st
  • 如何将Kafka数据导出到Prometheus?

    我在 kafka 主题中以时间序列的形式获得了 300K 指标 分钟 我想存储和查询数据 满足我需求的可视化工具是Grafana 为了有效地存储和查询 我正在考虑将这些时间序列存储在Prometheus中 具有大量时间序列的 Kafka 主
  • Excel 数据透视图线性时间刻度

    我有一个数据集 约 10000 行 其形式如下 DateTimeCreated Machine ProductName 2009 03 03 00 00 12 217 COMP001 Product001 我使用具有以下布局的数据透视表和图
  • 循环动画集会导致 StackOverflowError

    我正在删除一个 Android 应用程序 其中有一个无限重复的动画 导致 StackOverflowError 当同一对象上的另一个动画开始时 它会执行此操作 private fun pulse val randomGenerator Ra
  • “必须安装JRE 1.3或更高版本!” /“必须安装JDK 1.3或更高版本!”在 Windows 7 (x64) 上安装 JAI 1.1.3 时出错

    我收到这些错误 严重 必须安装JRE 1 3或更高版本 严重 必须安装JDK 1 3或更高版本 在 Windows 7 x64 上安装 JAI Java Advanced Imaging 1 1 3 时 JRE 7 1 7 安装在 C Pr
  • XUnit 使用 Cake 与 .NET Core 配合使用

    我有一个相对简单的解决方案 在 MSBuild 下一切正常 在 VS 2017 Mac 中 我正在创建一个 Cake 构建脚本 但我无法让单元测试正常工作 例子有很多 但似乎没有一个是有效的 有些人要求使用 DotnetCoreTest 大
  • MS 图表:获取真正的 InnerPlotPosition?

    使用 Microsoft Charts 创建图表时 我需要获取图表上网格的准确位置 This page http msdn microsoft com en us library dd456696 aspx says as I unders
  • 反编译Java项目并编译

    我在尝试着一个 java 项目 jar 文件 我可以从中获取 java 文件 现在我怎样才能把它编译回来呢 我可以将 java 文件作为单个文件添加到 Netbeans 中 但是如何将其添加为项目添加编译呢 该项目是一个JavaFX项目 所
  • 从 IntelliJ 调用 Maven 模块构建

    我想知道是否有人知道一种从 IntelliJ 调用特定 Maven 模块构建的方法 该模块还将构建 或使用已编译的类 它所依赖的模块 因此 例如 如果我只想构建图中的模块 模型 那么我单击其上的包步骤似乎是合理的 但它实际上做了什么 它调用
  • Promise 抛出“未处理的承诺拒绝”错误的奇怪行为

    当我使用 Node 运行此代码时 它会抛出一个Unhandled promise rejection控制台中出现错误 甚至显示error caught首先是文字 const promise new Promise resolve rejec
  • NetLogo BehaviourSpace - 使用报告器进行测量

    在我的 NetLogo 模型中 我的海龟被称为居民 每个居民都有自己的起始意见 initial opinion 和最终意见 final opinion 他们的意见是使用随机数计算的 因此当我更改某些参数时 我想运行模型至少 20 次 因此我
  • 如何在 Anaconda x64 上安装 Yandex CatBoost?

    我已经通过以下方式成功安装了 CatBoost pip install catboost 但是当我在 Jupiter Notebook 中尝试示例 python 脚本时出现错误 import numpy as np from catboos
  • 将双精度格式设置为分数[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有一个库可以将 Double 转换为带有整数 后跟小数的字符串 例如 1 125 1 1 8 我只
  • 检查方法参数的最佳方法是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我知道两种方法来检查方法的参数并在需要时抛出异常 1 对每个参数进行检查 错误时抛出异常 public void Method object p