我应该在私有/内部方法中添加空参数吗?

2024-01-08

我正在编写一个库,它具有多个公共类和方法,以及库本身使用的多个私有或内部类和方法。

在公共方法中,我有一个空检查和一个抛出,如下所示:

public int DoSomething(int number)
{
    if (number == null)
    {
        throw new ArgumentNullException(nameof(number));
    }
}

但这让我开始思考,我应该在方法中添加参数空检查到什么级别?我是否也开始将它们添加到私有方法中?我应该只对公共方法这样做吗?


最终,对此并没有形成统一的共识。因此,我不会给出是或否的答案,而是尝试列出做出此决定的考虑因素:

  • 空检查会使您的代码变得臃肿。如果您的过程很简洁,则它们开头的空防护可能会构成过程整体大小的重要部分,而不会表达该过程的目的或行为。

  • 空检查明确地规定了一个前提条件。如果某个方法在其中一个值为 null 时会失败,那么在顶部进行 null 检查是向临时读者演示这一点的好方法,而无需他们寻找取消引用的位置。为了改善这一点,人们经常使用名称如下的辅助方法Guard.AgainstNull,而不必每次都写支票。

  • 私有方法中的检查是不可测试的。通过在代码中引入无法完全遍历的分支,就无法完全测试该方法。这与测试记录类的行为以及该类的代码的存在是为了提供该行为的观点相冲突。

  • 让空值通过的严重程度取决于具体情况。通常,如果为空does进入该方法,几行后它将被取消引用,您将得到一个NullReferenceException。这实际上并不比抛出一个更不清楚ArgumentNullException。另一方面,如果该引用在取消引用之前被传递了相当多的时间,或者如果抛出 NRE 会使事情处于混乱状态,那么尽早抛出就更重要了。

  • 一些库(例如 .NET 的 Code Contracts)允许一定程度的静态分析,这可以为您的检查带来额外的好处。

  • 如果您正在与其他人一起开发一个项目,则可能有现有的团队或项目标准涵盖了这一点。

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

我应该在私有/内部方法中添加空参数吗? 的相关文章

  • 使用 mono/nunit-console/4 在 Mac OS X 控制台上运行测试

    我安装了 Max OS X 10 11 1 上面装有 Xamarin 我编写了简单的测试类 只是为了测试在 Mac OS X 和 Ubuntu 上运行 Nunit 测试 该类实际上有一个返回字符串的方法 using System names
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • VS 程序在调试模式下崩溃,但在发布模式下不崩溃?

    我正在 VS 2012 中运行以下程序来尝试 Thrust 函数查找 include cuda runtime h include device launch parameters h include
  • 读取 C# 中的默认应用程序设置

    我的自定义网格控件有许多应用程序设置 在用户范围内 其中大部分是颜色设置 我有一个表单 用户可以在其中自定义这些颜色 并且我想添加一个用于恢复默认颜色设置的按钮 如何读取默认设置 例如 我有一个名为的用户设置CellBackgroundCo
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • 将标量添加到特征矩阵(向量)

    我刚刚开始使用 Eigen 库 无法理解如何向所有矩阵成员添加标量值 假设我有一个矩阵 Eigen Matrix3Xf mtx Eigen Matrix3Xf Ones 3 4 mtx mtx 1 main cxx 104 13 error
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 使用restsharp序列化对象并将其传递给WebApi而不是序列化列表

    我有一个看起来像的视图模型 public class StoreItemViewModel public Guid ItemId get set public List
  • 抛出 Java 异常时是否会生成堆栈跟踪?

    这是假设我们不调用 printstacktrace 方法 只是抛出和捕获 我们正在考虑这样做是为了解决一些性能瓶颈 不 堆栈跟踪是在构造异常对象时生成的 而不是在抛出异常对象时生成的 Throwable 构造函数调用 fillInStack
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo

随机推荐

  • flex-box:先收缩再包裹

    我有一个包含多个列的布局 其中一些是固定的 另一些则根据需要进行拉伸 因此 我使用弹性盒 此外 我想要并且需要使用 flex wrap 结构是这样的 div class row style display flex div class co
  • Xcode 7.3 缺少私有框架

    我最近将 Xcode 升级到了 7 3 版本 当我编译现有项目时 我收到此错误消息 directory not found for option F Applications Xcode app Contents Developer Pla
  • 基于类的视图“没有属性.as_view()”错误

    我正在跟进本教程 http code tutsplus com tutorials beginners guide to the django rest framework cms 19786 尝试为我的API制作一个Products ta
  • 为什么 grep 如此慢并且使用 -w (--word-regexp) 标志占用大量内存?

    我在一个文件和一个数据文件 大小约为 3 2Gb 中有一个 id 列表 我想提取数据文件中包含 id 的行以及下一行 我做了以下事情 grep A1 Ff file ids file data grep v gt output data 这
  • 加密 app.config 文件

    我有一个 app config 文件 需要与我的应用程序一起分发 它是由于我添加的对 ASMX Web 服务的服务引用而创建的 如果这个文件被修改 查看 这并不是什么大问题 但我仍然希望确保它的安全 我已经检查了配置的哈希值并确保其有效 但
  • PHP 还是 Python 进行图像处理?

    我正在编写一个图像处理应用程序 我只是想知道哪种编程语言最适合 Python 或 PHP 这个过程是基于系统的 而不是基于网络的 所以我只是想Python是否可以提供更多帮助 让我知道你的想法 Python 有类似的东西SciPy http
  • WebView的LOAD_NO_CACHE设置仍然将文件保存到磁盘吗?

    尽管使用webview getSettings setCacheMode WebSettings LOAD NO CACHE 时 WebView 仍然将 MB 的文件保存到缓存中 有没有办法真正禁用缓存 Thanks 似乎没有什么可以完全禁
  • 如何直接将ASP.NET MVC1升级到MVC3?

    我有一个 ASP NET MVC1 项目 想将其直接升级到 MVC3 我假设有两条路 直接从1升级到3 升级到 2 然后第二次升级到 3 最常走的路是哪条 如果您正在使用ASP NET项目升级工具 http aspnet codeplex
  • 从 PostgreSQL 函数生成 HTML

    谁能帮我这个 我有一个任务是编写一个函数 它将根据 PostgreSQL plpgsql 语言 中给定的表名生成 HTML 表 我已经写了这个 但它离我的需要还很远 它会为我给出的列生成一个表 目前只有一个 但我只需要给表一个名称 创建或替
  • Vue:在 div 单击时,转到数据中定义的 url

    我在数组中有这种对象 name name1 url http url 1 tld name name2 url http url 2 tld 单击 div 时 我想要将 window location href 指向url 但我似乎无法从数
  • 如何以编程方式将代理添加到 NSURLSession

    查看文档NSURLSession and NSURLSessionConfiguration 我的印象是我应该使用如下所示的字典来配置它 Create a dictionary to describe the proxy NSDiction
  • 后台线程 Core Data 对象属性更改不会反映在 UI 上

    假设我想添加一个新项目PlaylistCoreData 的实体并将其放入后台线程并将其推回到主线程 然后将其反映在 tableView 上 好吧 该代码在没有后台线程实现的情况下工作正常 但是当我应用下面的背景代码时 之后createPla
  • 两个不同平台上的类文件大小是否存在差异?

    假设我有一个包含大量代码的 java 文件 如果我在不同的平台上构建这个文件 就像windows和solaris一样 两个类文件是否有可能具有可识别的不同大小 如果是 原因是什么 如果您使用不同版本的编译器或不同的设置 特别是关于包含哪些调
  • 撰写:将文本包装在行布局中,而不是将同级文本推出

    我正在尝试 Jetpack Compose 但 Row 的行为让我感到困惑 我在图标按钮旁边有一个文本 我希望图标按钮锚定到最小宽度为 48dp 的一侧 并让文本环绕它 像这样 但文本不会换行 它会占用行中的所有空间 Composable
  • 编写没有语法文件的自定义 Xtext/ANTLR 词法分析器

    我正在为 CoffeeScript 编写一个 Eclipse Xtext 插件 我意识到我可能需要手动为其编写一个词法分析器 CoffeeScript 解析器还使用手写词法分析器 https github com jashkenas cof
  • mod_php 和 cgi php 脚本有什么区别?

    mod php 和 cgi php 脚本有什么区别 我的意思是 为什么最好 是吗 使用 mod php 而不是简单的 php 脚本 并将它们作为 CGI 运行 Thanks 使用 CGI 时 PHP 进程由 Apache 启动 并且是该 P
  • SLComposeViewController 完成处理程序

    您好 如果使用 SLComposeViewController CompletionHandler 完成推文 我如何收到通知 这是发送推文的代码 if SLComposeViewController isAvailableForServic
  • 在没有 IIS 和 VS 2017 的情况下使用 Kestrel

    依赖于微软文档 Kestrel 可以单独使用 也可以与反向代理服务器 例如 IIS Nginx 或 Apache 一起使用 反向代理服务器接收来自 Internet 的 HTTP 请求 并在进行一些初步处理后将它们转发到 Kestrel 如
  • 使用导数和雅可比增强 odeint 类

    我打算在 MCMC 例程中使用 Boost odeint 库来估计 ODE 模型中的参数 由于这些 ODE 可能很僵硬 因此我需要能够将雅可比矩阵与导数一起传递到求解器中 我想创建一个类 其中参数和初始值作为私有成员 然后将导数 雅可比和更
  • 我应该在私有/内部方法中添加空参数吗?

    我正在编写一个库 它具有多个公共类和方法 以及库本身使用的多个私有或内部类和方法 在公共方法中 我有一个空检查和一个抛出 如下所示 public int DoSomething int number if number null throw