首页 > 编程语言 >正确理解c# default关键字

正确理解c# default关键字

时间:2024-01-16 15:26:10浏览次数:33  
标签:return source c# default API found 默认值 正确理解

背景

最近QA测试一个我开发的一个Web API时,我意识到之前对C#的default的理解一直是想当然的。具体情况是这样,这个API在某些条件下要返回模型的默认值,写法类似于下面这样

[HttpGet(Name = "GetWeatherForecast")]
public WeatherForecast Get()
{
   return default;
}

实际上,这个API会返回204 No Content,而不是想象中的一个空的WeatherForecast。API返回204,说明default得到值是null,为什么会这样?

正确理解default

查看C#语言规范里的说明,default表达式是产生一个类型的默认值(A default value expression produces the default value of a type),而不是类的默认值(Type和Class都被翻译成类真是不太友好)。 我们知道,C#里引用类型的默认值就是null,对此通过查看IL,可以发现给一个引用类型赋默认值,就是通过ldnull指令将一个空引用推送到计算堆栈上。

IL_0001: ldnull
IL_0002: stloc.0      // V_0

对于值类型,比如decimal,则是通过initobj指令将位于指定地址的基元类型字段初始化0。

IL_0001: ldloca.s     'value'
IL_0003: initobj      [System.Runtime]System.Decimal

newobj不同, initobj不调用构造函数,只用于初始化值类型。引用类型和值类型的默认值都可以认为是常量。

真相大白,现在我们知道为什么上面那种情况API会返回204,还是要多看文档,不能想当然。

应用

在linq里,我们常用的FirstOrDefault方法,如果没有找到返回的默认值,内部其实就是返回的default

 private static TSource? TryGetFirst<TSource>(this IEnumerable<TSource> source, out bool found)
 {
     if (source == null)
     {
         ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
     }

     if (source is IPartition<TSource> partition)
     {
         return partition.TryGetFirst(out found);
     }

     if (source is IList<TSource> list)
     {
         if (list.Count > 0)
         {
             found = true;
             return list[0];
         }
     }
     else
     {
         using (IEnumerator<TSource> e = source.GetEnumerator())
         {
             if (e.MoveNext())
             {
                 found = true;
                 return e.Current;
             }
         }
     }

     found = false;
     return default;
 }

如果你已经厌倦用null判断是否为空,现在多了一个default选项。

if (_settings == default){

}

参考

标签:return,source,c#,default,API,found,默认值,正确理解
From: https://www.cnblogs.com/netry/p/17965805/csharp-default-keyword

相关文章

  • BOSHIDA DC电源模块在物联网设备中的关键作用
    BOSHIDADC电源模块在物联网设备中的关键作用DC电源模块在物联网设备中发挥着关键作用。物联网设备通常需要稳定可靠的电源供应,以保证设备的正常运行。DC电源模块提供了相应的电压和电流输出,为物联网设备提供所需的电力。 具体来说,DC电源模块在物联网设备中的关键作用包括:1.......
  • 高速视频采集卡设计方案:620-基于PCIe的高速视频采集卡
    一、产品概述   基于PCIe的高速视频采集卡,通过PCIe3.0X8传输到存储计算服务器,实现信号的分析、存储。    北京太速科技产品固化FPGA逻辑,适配视频连续采集,缓存容量2GB,开源的PCIe QT客户端软件,用户可以在很短的时间内完成视频程序的开发,开发效率高、难度小。  ......
  • C语言——函数指针类型转换
    昨天为了避免跨层调用API搞了个回调函数,用了函数指针,因为参数类型的问题总是编译报错,今天就看了两篇博文学习学习,顺便做做笔记。其实正常来讲只要把函数指针的参数个数、类型和返回值这些函数指针的标签或者说是属性写对了的话就不会有社么问题,但我也不知道怎么着就会报......
  • 《全局实例篇》Vue.compont注册全局组件
    注册一个全局组件语法格式如下:Vue.component(tagName,options)tagName为组件名,options为配置选项。注册后,我们可以使用以下方式来调用组件:<tagName></tagName>全局组件所有实例都能用全局组件。<divid="app"> <runoob></runoob></div><script>//注册Vue.compon......
  • Apache DolphinScheduler 3.1.8 保姆级教程【安装、介绍、项目运用、邮箱预警设置】轻
    概述ApacheDolphinScheduler是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。ApacheDolphinScheduler旨在解决复杂的大数据任务依赖关系,并为应用程序提供数据和各种OPS编......
  • 关于CH32V003J4M6下载烧录注意事项
    对CH32V003J4M6进行下载烧录时,注意打印引脚要修改使用复用的打印引脚,否则因为PD1与PD5引脚是合封在一起的,使用默认的打印引脚之后会导致PD1的SWDIO信号受影响而无法下载以及debug,需要清空flash之后才能继续下载使用。  ......
  • Docker Compose学习路线
    DockerCompose是一种用于定义和运行多容器Docker应用程序的工具。以下是一份DockerCompose的学习路线:基础知识:了解DockerCompose的概念和用途熟悉DockerCompose的基本语法和命令环境搭建:安装Docker和DockerCompose配置DockerCompose环境变量基本概念和配置......
  • 文心一言 VS 讯飞星火 VS chatgpt (180)-- 算法导论13.4 3题
    三、用go语言,在练习13.3-2中,将关键字41、38、31、12、19、8连续插入一棵初始的空树中,从而得到一棵红黑树。请给出从该树中连续删除关键字8、12、19、31、38、41后的红黑树。文心一言,代码不能运行:为了解决这个问题,我们首先需要构建一棵红黑树,然后依次删除给定的关键字。以下......
  • 《标签篇》Vue.directives自定义指令v-my
    参考链接:https://www.runoob.com/vue2/vue-custom-directive.html自定义指令除了默认设置的核心指令(v-model和v-show),Vue也允许注册自定义指令。下面我们注册一个全局指令v-focus,该指令的功能是在页面加载时,元素获得焦点:<divid="app"> <p>页面载入时,input元素自......
  • 使用shell脚本xtrabackup自动恢复MySQL数据库
    【背景说明】按照安全的一些要求,需要定期对数据库进行恢复演练操作【环境说明】MySQL5.7的xtrabackup全库xbstream的加密备份(如果不是流备份跟加密,去掉相关参数)【脚本说明】v_backupdir="/mysqlbackup/recovery/yiyuan"备份文件的目录路径v_dir="/mysqlbackup/recovery/......