02.net开发实用:c#默认值和可空类型常见的操作

2023-11-21

说明

.net core 3.0

本文整理了一些关于c#默认值和可空类型常见的操作

常见值类型默认值

值类型包括简单类型、枚举类型、结构类型、可以为null的值类型

简单类型
  • 有符号的整型:sbyte、short、int、long。默认值为 0
  • 无符号的整型:byte、ushort、uint、ulong。默认值为 0
  • Unicode 字符:char。默认值为 0'\0'
  • IEEE 二进制浮点:float、double。默认值为 0
  • 高精度十进制浮点数:decimal。默认值为 0
  • 布尔:bool。默认值为 false(0)
枚举、结构类型、可以为null的值类型
  • 枚举类型默认值会取值为0的枚举项
  • 结构类型的默认值指的是该结构内部字段的默认值,会将所有值类型的字段设置为其默认值,将所有引用类型的字段设置为 null
  • 可空的值类型,默认值为null

如何有效判断

各种类型,如何有效判断?

  • 对于引用类型,我么可以使用 x != null 判断是否为默认值
  • 对于值类型,我们可以使用 x != default 判断是否为默认值。若该变量的值刚好等于该类型的默认值,则该变量为默认值
  • 对于可空的值类型,我们还可以使用 x.HasValue 判断是否有值,而且 HasValue 不会引发空指针异常

统一判断默认值

统一判断各种类型是否为默认值,参考:c# - Check to see if a given object (reference or value type) is equal to its default - Stack Overflow

反射中应用

准备一个类和数据,我们要一步一步演示如何将利用反射机制给类的属性进行赋值

第一步:直接根据key,给对应的属性赋值

image-20231120172104679

运行时SetValue处出现类型转换异常:Object of type 'System.String' cannot be converted to type 'System.DateTime'。无法将字符串隐式转换为DateTime类型,我们要先手动转换类型再进行赋值

第二步:先手动转换为属性对应的类型再进行赋值

image-20231120172320655

运行时 Convert.ChangeType 处出现类型转换异常:Null object cannot be converted to a value type。Convert.ChangeType 无法处理null,我们要先手动判断一下。

第三步:在Convert.ChangeType 处理前,手动判断是否为null

image-20231120173304578

运行时 Convert.ChangeType 处出现类型转换异常:Invalid cast from 'System.String' to 'System.Nullable`1[[System.DateTime... 无法将字符串转换为DateTime?(可空)类型,对于可空类型我们要单独处理

第四步:判断属性是否为可空类型,并对可空类型进行转换处理

判断属性是否为可空类型:property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))

执行后,基本可以满足需求。关于反射能想到的就这些,后面遇到再补充了。

image-20231120173950952