细说可空类型 nullable PropertyType
可空类型是System.Nullable结构体的实列。一个可空类型代表了相应值类型的正确范围附加null值。这么说来,其实也不是很明子,命题嘛,一般不求易懂,但求准确。
那我就来说说这可空类型吧,上次说到了值类型与引用类型,其中就说到了,值类型是不能为空的,int i=null是错的,值类型为能为空,但我们有时候需要让值类型也可以为空,怎么办呢,那就在值类型的值的范围上扩充一个null值。
- 为什么要有可空类型
我们在日常开发中,什么地方需要让值类型也变成可空呢?如果你有试过把数据库内的数据对象化的时候,面对数据库中的字段定义如:
要转化成对象
public class XXXX
{
public int id { get; set; }
//……
}
这时候就出现问题了,在数据库中是允许为空的,但是在类设计的时候,int类型就是不允许为空的,你不给它赋值,它也是有默认值0的。怎么办?这与数据库的设计是有冲突的,于是,就必须使用咱们的可空类型,我个人理解这也就是为什么要有可空类型的原因。
- 怎么表示可空类型
使用可空类型,上面的类就可以写成
public class XXXX
{
public int? id { get; set; }
//……
}
没看错,就是在int后面加上?号,这就是可空类型的表示,当然还有其它的表示方式
Nullable<int> d = null;
这两种表示方式其实是等效的,就根据喜好和使用场景灵活使用就行。
- 怎么判断是null还是其它值
- 对于可空类型,我们可以很简单地使用null与可空类型进行比较,就可能判断变量的值是否为null。如:
隐藏行号 复制代码 ?这是一段程序代码。
Nullable<int> d = null;
bool isNull = d == null ? true : false;
- 当然,我还有其它的办法与方法来做这同样效果的事,如:
隐藏行号 复制代码 ?这是一段程序代码。
Nullable<int> d = null;
bool isNull = !d.HasValue;
- 注意,如果HasValue是为false时,使用 var result=d.Value时,会抛出异常System.InvalidOperationException
- 根据情况,根据需要,灵活使用以上两种判断方法。
- 可空类型怎么给值类型赋值
- 可空类型不可以直接转化成值类型,也不可以直接对值类型赋值,如:
隐藏行号 复制代码 ?这是一段程序代码。
Nullable<int> d = null;
int result = d;//错
int result = (int)d;//错
那怎么做呢,最简单的办法就是
隐藏行号 复制代码 ?这是一段程序代码。Nullable<int> d = null;
int result = d.GetValueOrDefault();
这时result的值为0;
或者也可以判断是否为空,对它进行赋值
隐藏行号 复制代码 ?这是一段程序代码。Nullable<int> d = null;
int result;
if (!d.HasValue)
{
result = d.Value;
}
如果可空类型是经过运算给值类型赋值。那就还有一种办法
隐藏行号 复制代码 ?这是一段程序代码。Nullable<int> d = null;
int result = d ?? +1;
即使用??进行转意。这是的result的值为1;
- 反射中的可空类型
- 我们经常会在反射中使用的可空类型,那怎么来使用可空类型呢?
隐藏行号 复制代码 ?这是一段程序代码。
public class NullableTest
{
public int? ID { get; set; }
}
var propertyInfo= typeof(NullableTest).GetProperty("ID");
查询变量的值时,我们会发现
propertyInfo.PropertyType.Name | Nullable`1 |
propertyInfo.PropertyType.IsGenericType | true |
propertyInfo.PropertyType.IsGenericTypeDefinition | false |
propertyInfo.PropertyType.GetGenericTypeDefinition().Name | Nullable`1 |
我们根本无法使用一般泛型得到泛型基类型的方法GetGenericTypeDefinition()得到可空类型的基类型,此时,我们就需要使用GetGenericArguments()去得到泛型的基础类型。
var propertyInfo = typeof(NullableTest).GetProperty("ID");
if (propertyInfo.PropertyType.IsGenericType && propertyInfo.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
Type[] typeArray = propertyInfo.PropertyType.GetGenericArguments();
Type baseType = typeArray[0];
}
做到这里,我们就可以使用反射来完成任何我们想要的操作了。
细说可空类型 nullable PropertyType的更多相关文章
- 【转】四、可空类型Nullable<T>到底是什么鬼
[转]四.可空类型Nullable<T>到底是什么鬼 值类型为什么不可以为空 首先我们都知道引用类型默认值都是null,而值类型的默认值都有非null. 为什么引用类型可以为空?因为引用类 ...
- 四、可空类型Nullable<T>到底是什么鬼
值类型为什么不可以为空 首先我们都知道引用类型默认值都是null,而值类型的默认值都有非null. 为什么引用类型可以为空?因为引用类型变量都是保存一个对象的地址引用(就像一个url对应一个页面),而 ...
- 【C#】可空类型(Nullable)
C# 可空类型(Nullable) C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值. 例如,Nullable& ...
- 可空类型 Nullable<T>
Nullable<T> 内部实现了显示和隐式转换 显示转换: public static explicit operator T(T? value) { return value.Valu ...
- 【C#】可空类型 NullAble<T>
在实际编写代码时候 , 会遇到很多场景, 需要将值置成空, 比如发货日期, 有可能是没有. 在没有可空类型之前, 程序都是用 魔值, 即为一个minValue或者常量, 来代表这个值为空, 也有用一 ...
- 可空类型Nullable
Nullable类型: 值类型变量默认为0,不可空,为了使它可空,出现了Nullable类型,类型前面加? 变为引用类型 值类型是没有null值的,比如int,DateTime,它们都有默认值.举个 ...
- 雷林鹏分享:C# 可空类型(Nullable)
C# 可空类型(Nullable) C# 可空类型(Nullable) C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 nu ...
- C#2.0之可空类型
可空类型Nullable<T> 在C#2.0之前 ,值类型一直不可以为null,但是实际开发中常常会有这样的需求,比如结束时间. 为什么不可以为null 对于引用类型来说,null代表着空 ...
- C# Nullable可空类型
一个Nullable类型就是基本类型加上一个"是否为null指示器"的合成类型.对于一个类型,如果既可以给他分配一个值,也可以给它分配null引用,我们就说这个类型是可空的. 可空 ...
随机推荐
- cvte2018春招前端开发实习面试分享
编程题问题描述: 返回整数数组中出现次数第n多的数字(返回值可能有多个) 最近在找实习,面试二面最后出了一道这样的编程题,当时有思路但语法有错误,而且很紧张,最后没有运行出来,导致凉凉,回来重新思考了 ...
- kafka读书笔记《kafka并不难学》
======第一章 1 在高并发场景,如大量插入.更新数据库会导致锁表,导致连接数过多的异常,此时需要消息队列来缓冲一下.消息队列通过异步处理请求来缓解压力 2 消息队列采用异步通信机制消息队列拥有先 ...
- Mac下mysql出现错误:ERROR 1055 (42000)
问题原因: ONLY_FULL_GROUP_BY的意思是:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句 ...
- 2019 杭电多校第八场 HDU - 6665 Calabash and Landlord 两矩形分平面
题意 给出两个矩形,问这两个矩形把平面分成了几部分. 分析 不需要什么高级技能,只需 “简单” 的分类讨论. (实在太难写了,对拍找出错误都不想改 推荐博客,其中有个很好的思路,即只讨论答案为2,3, ...
- 微信小程序之小技能篇(一)
1,三目运算改变class值: <view class="{{flag ? 'change' : 'change_after'}}">改变字体颜色</view&g ...
- 遇到一张jpg的图片打不开,ps打不开,fireworks,打不开,ie8浏览器上显示不了,其他的浏览器没问题
1.在photoshop上报错; 2.在fireworks上报错 3.ie8上 其他的图片都可以,就这张不可以,没发现什么不同的地方,都是jpg格式的呀,而且谷歌浏览器能显示出来; 处理方法: 1.选 ...
- wepy框架滑动组件使用
https://github.com/dlhandsome/wepy-com-swiper
- 新的log4j2.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- OFF < FATAL < ERROR & ...
- 将List<E>内对象按照某个字段排序
主要用到java.util的Collections类 Collections.sort(list); 其中,E必须实现Comparable<E>接口
- P3313 [SDOI2014]旅行——树链剖分+线段树(动态开点?)
P3313 [SDOI2014]旅行 一棵树,其中的点分类,点有权值,在一条链上找到一类点中的最大值或总和: 树链剖分把树变成链: 把每个宗教单开一个线段树,维护区间总和和最大值: 宗教很多,需要动态 ...