空合并运算符是否缓存 c# 中的结果

2023-11-26

我知道做(myValue ?? new SomeClass())类似于(myValue == null ? new SomeClass() : myValue)

但出于好奇,当我调用函数时是否有任何性能优势,比如(getResult() ?? new SomeClass()). Will getResult()被处决两次?这似乎不直观,因为我只指定了一次方法调用。


好吧,如果“缓存”是指将其存储在临时变量中,那么是的。

这个构造:

var result = (getResult() ?? new SomeClass());

可以认为等价于:

var <temp> = getResult();
if (<temp> == null)
    <temp> = new SomeClass();
result = <temp>;

这也告诉你第二部分,后面的操作数??如果第一个操作数不是,则根本不执行null.

因此,回答您的具体问题:

  1. 每个操作数最多被评估一次
  2. 仅当第一个操作数的计算结果为时才计算第二个操作数null

另请注意,您可以链接这些:

var result = first() ?? second() ?? third() ?? fourth();

结果是:

  1. 评估first()
  2. If first()评估为null, 评估second()
  3. If second()评估为null以及评估third()
  4. 如果以上所有评估结果为null,最后评价fourth

结果是返回的第一个(没有双关语)非空值。


这种类型的代码在新的 C# 中将通过新的?.操作员:

var result = first?.second?.third;

这是基本的.处理,即。它将读取second成员first,然后是third任何事物的成员second是,但它会在第一个时停止null,并且还将确保每个步骤仅评估一次:

(obj as IDisposable)?.Dispose();

obj as IDisposable只会评估一次。

TryGetObjectToSave()?.Save();

只会打电话TryGetObjectToSave()一次,如果它返回一些东西,Save()方法将被调用。

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

空合并运算符是否缓存 c# 中的结果 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • jQuery UI 网站上的垂直“选项卡”组件

    jQuery UI 具有一个漂亮的 垂直选项卡 小部件来在章节之间切换在其自己的网站上 有谁知道这是否建立在某种标准小部件上 你would期望 UI 自己的 选项卡 组件用于此目的 但没有骰子 或者它是否是定制的 粗略地浏览一下代码让我怀疑
  • 使用 dplyr,如何通过管道或链接到plot()?

    我是 dplyr 包的新手 并尝试将其用于我的可视化作业 我可以将我的数据通过管道传输到ggplot 但无法做到这一点plot 我碰到这个帖子包括评论中的答案在内的答案对我不起作用 Code 1 emission lt mynei gt s
  • 拖动多个项目时,此视图不允许 DataGrid“EditItem”

    我有一个数据网格 它获取如下数据 public struct MyData public string name set get public string artist set get public string location set
  • 在 PyQt 中对单选按钮进行分组

    import sys from PyQt4 import QtCore QtGui class Class1 QtGui QMainWindow def init self super Class1 self init self func
  • 如何在日期选择器中将日期格式 (MM/DD/YY) 更改为 (YYYY-MM-DD)

    我有以下日期选择器脚本
  • 如何修复 WordPress 中的“已达到 508 资源限制”错误?

    508 已达到资源限制 Wordpress 此错误一次又一次发生 我无法在没有看到此错误的情况下发布单个帖子 由于超出资源限制 该网站暂时无法满足您的请求 请稍后再试 我该如何解决这个问题 实际上 当进程数量超过托管提供商设置的限制时 就会
  • jQuery.on() 是否适用于创建事件处理程序后添加的元素?

    我一直以来的印象是 on 工作就像 live 关于动态创建的元素 例如我使用 foo on click function alert click 然后是一个带有类的元素foo是由于某些 AJAX 创建的 现在我期望单击该元素会引发警报 实际
  • 如何用 PHP 替换字符串中的变量?

    所以我有一些 PHP 代码 如下所示 message Here is the result s 我只是用 s 作为例子 它基本上是一个占位符 用于存放任何内容 然后我将字符串传递给一个函数 我希望该函数将 s 替换为该值 我需要做什么才能实
  • 如何在 ruby​​ 中使用 utf8 的正则表达式

    在 RoR 中 如何使用 utf8 代码验证发布表单的中文或日文单词 在GBK代码中 它使用 u4e00 u9fa5 来验证中文单词 在 Php 中 它使用 x 4e00 x 9fa5 u 来表示 utf 8 页面 Ruby 1 8 对 U
  • 如何在 JavaScript 中逐行读取文本文件?

    我需要用 JavaScript 逐行读取文本文件 我可能想对每一行做一些事情 例如跳过或修改它 并将该行写入另一个文件 但具体行动超出了这个问题的范围 有很多类似措辞的问题 但大多数实际上是一步将整个文件读取到内存中 而不是逐行读取 因此这
  • 通过电子邮件发送表格

    我需要通过电子邮件发送查询结果 我使用两种方法 获取数据表 执行查询并获取数据表 需要通过邮件发送 发送自动电子邮件 发送自动电子邮件 问题 我需要在电子邮件中发送数据表或 html 表 类似于下面的代码 这对于代替 dataTable 的
  • Entityframework Core 3 linq 表达式无法翻译

    我刚刚升级到 EF 3 曾经有效的查询之一现在出现异常 ProductionRecords context ProductionRecords Where r gt r DataCriacao Date DateTime Now Date
  • kotlin RecyclerView 分页

    我需要让我的RecyclerView仅加载 10 个项目 并在滚动后加载更多 10 个项目 就像这样工作 我使用添加数组中的项目Volley 这是我的RecyclerView适配器 class newsAdapter constructor
  • C# 中两个对象之间的差异

    我想知道如何找到同一类的两个对象之间的差异 因此 如果我有一个 Person 类 唯一的区别是年龄 它将返回不同的字段 Thanks 这不是 C 或 NET 实际上 直接支持的东西 但是您可以为特定类型手动实现某些东西 或者编写使用反射来区
  • 如何以多线程方式读取文件?

    我目前有一个程序 可以在单线程模式下读取文件 非常大 并创建搜索索引 但在单线程环境中索引需要很长时间 现在我正在尝试使其在多线程模式下工作 但不确定实现这一目标的最佳方法 我的主程序创建一个缓冲读取器并将实例传递给线程 线程使用缓冲读取器
  • 如何向 boost::log 控制台输出添加颜色编码?

    我正在尝试在 Linux 下为 boost log 添加彩色日志输出 我读下列我尝试过这个 define MY LOG ERROR BOOST LOG TRIVIAL error lt lt 033 1 31 MY LOG ERROR lt
  • android.net.wifi.STATE_CHANGE:Wifi 断开连接时未触发

    只有广播意图和行动正常吗NETWORK STATE CHANGED ACTION 其常数值为android net wifi STATE CHANGE Wifi 连接何时恢复 IE 当 Wifi 断开时我没有意识到这个意图 UPDATE 我
  • 数据类型(DataType.Date)格式(MVC)

    我们可以以某种方式应用这种格式吗 Display Name Date of Birthday DataType DataType Date public DateTime DOB get set 我只想查看日期而不是时间 谢谢你 您可以使用
  • 阿帕奇汤姆猫8.5。错误:服务因服务特定错误而终止,功能不正确

    我一个月前在 Windows Server 2008 上安装了 apache tomcat 8 5 和 java 1 8 并且运行正常 现在服务已停止 我无法从 apache 配置或 Windows 服务重新启动它 它总是停止的 我收到以下
  • 空合并运算符是否缓存 c# 中的结果

    我知道做 myValue new SomeClass 类似于 myValue null new SomeClass myValue 但出于好奇 当我调用函数时是否有任何性能优势 比如 getResult new SomeClass Will