一个对象的属性中有一个datetime类型的属性,在赋值时未给予赋值,此时系统会分配给它一个最小的时间,不会是null值,与int类型相似,datetime也不会有null类型,

先来看一段代码:

null值用来表示数据类型未被赋予任何值,它是一种引用类型且它只能赋值给引用类型,由于string是一个特殊的引用类型,因此编译器不会报错。

但是当它赋值给值类型int类型的时候,编译器就会报错:

我们知道数据库中是有NULL值的,例如下面的一张表,年龄(int类型)是可以为空的,代表目前不知道此人年龄,那么当我们在C#代码向数据库插入数据时,就会需要一个可空的int类型。

但是int、bool等这些类型不能表示数据库中的“Null” 。因此C#提供了“可空类型”这种语法,只要在类型后加?就构成了可空的数据类型,比如int?、bool?,这样
int? i=null 就可以了。解决数据库中int可以为null,而C#中int不能为null的问题。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace 可空数据类型
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. //string s1 = null;
  12. int? i = null;
  13. Console.WriteLine(i);
  14. }
  15. }
  16. }

由于i为空,所以不会有任何数据显示。

T?其实是System.Nullable<T>的简写,可空类型在ADO.NET编程中大量使用,用来解决数据库与C#代码数据类型不一致的问题。

来看一下msdn文档中关于System.Nullable的说明:

System.Nullable的定义:

由它的定义可知:判断可空类型是否为空,用i==null或者i.HasValue;得到可空变量的值,int i1=(int)i.Value或者int i1=i.Value。
类型转换:不可空类型赋值给可空类型无需显式转换(一定成功),可空类型赋值给不可空类型则需显式转换(不一定成功)

如果int? i3 = null;

  1. static void Main(string[] args)
  2. {
  3. int? i = null;
  4. int? i3 = null;
  5. //int? i3 = 8;//不可空类型赋值给可空类型无需显式转换(一定成功)
  6. if (i3 == null)
  7. {
  8. Console.WriteLine("i3为空");
  9. }
  10. else
  11. {
  12. i3++;
  13. int i4 = (int)i3;//可空类型赋值给不可空类型则需显式转换(不一定成功)例如i3为空,则不成功!
  14. Console.WriteLine("i3不为空,{0}", i3);
  15. }
  16. if (i3.HasValue)
  17. {
  18. int i4 = i3.Value;
  19. Console.WriteLine("i3不为空,{0}", i3);
  20. }
  21. else
  22. {
  23. Console.WriteLine("i3为空!");
  24. }
  25. }

如果int? i3 = 8;

  1. static void Main(string[] args)
  2. {
  3. int? i = null;
  4. //int? i3 = null;
  5. int? i3 = 8;//不可空类型赋值给可空类型无需显式转换(一定成功)
  6. if (i3 == null)
  7. {
  8. Console.WriteLine("i3为空");
  9. }
  10. else
  11. {
  12. i3++;
  13. int i4 = (int)i3;//可空类型赋值给不可空类型则需显式转换(不一定成功)例如i3为空,则不成功!
  14. Console.WriteLine("i3不为空,{0}", i3);
  15. }
  16. if (i3.HasValue)
  17. {
  18. int i4 = i3.Value;
  19. Console.WriteLine("i3不为空,{0}", i3);
  20. }
  21. else
  22. {
  23. Console.WriteLine("i3为空!");
  24. }
  25. }

关于datetime和int 是否可为null的问题的更多相关文章

  1. 使用.NET向webService传double、int、DateTime 服务器得到的数据时null的问题(转http://blog.csdn.net/slimboy123/article/details/4366701)

    用C#.NET调用Java开发的WebService时,先在客户端封装的带有int属性的对象,当将该对象传到服务器端时,服务器端可以得到string类型的属性值,却不能得到int类型.double和D ...

  2. DateTime?转化为DateTime,int? 转 int

    深入理解C#---1.可空类型 https://blog.csdn.net/tianzeyu1992/article/details/52618131 原文:https://blog.csdn.net ...

  3. 关于datetime 和 int 之间相互转换

    在其他地方看到一个有点意思的东西.是记录转换规则的. DECLARE @Date1 DATETIME = '2016-06-21 11:53:00' , @Date2 DATETIME = '2016 ...

  4. python 将mysql数据库中的int类型修改为NULL 报1366错误,解决办法

    gt.run_sql()是用pymysql 封装的类 distribution_sort_id type: int目的:将此字段值全部修改为NULL g=2gt.run_sql("updat ...

  5. Mysql时间存储类型优缺点?DATETIME?TIMESTAMP?INT?

    TIMESTAMP 4个字节储存;值以UTC格式保存;.时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区. DATETIME 8个字节储存;实际格式储存;与时区无关;datetime  ...

  6. Mysql存储日期类型用int、timestamp还是datetime?

    通常存储时间用datetime类型,现在很多系统也用int存储时间,它们有什么区别?个人更喜欢使用int这样对于日期计算时比较好哦,下面我们一起来看到底那种会好些. int ().4个字节存储,INT ...

  7. 用TIMESTAMP类型取代INT和DATETIME

    时间在我们开发中应用非常普遍,大部分开发中我们将用Mysql的datetime格式来存储,但是对于经常用时间来排序或者查询的应用中,我们要将时间做成索引,这个就跟查询效率很有关系,但是很多程序员会用i ...

  8. MySQL时间字段究竟使用INT还是DateTime

    今天解析DEDECMS时发现deder的MYSQL时间字段,都是用 `senddata` ) unsigned '; 随后又在网上找到这篇文章,看来如果时间字段有参与运算,用int更好,一来检索时不用 ...

  9. C#根据日期DateTime和持续时间int找到日期

    protected DateTime GetFinish(DateTime start, int duration) { return start.AddDays(duration); } prote ...

随机推荐

  1. TCP/UDP网络编程的基础知识与基本示例(windows和Linux)

    一.TCP编程的一般步骤 服务器端: 1.创建一个socket,用函数socket() 2.绑定IP地址.端口等信息到socket上,用函数bind() 3.开启监听,用函数listen() 4.接收 ...

  2. 从汇编看c++中含有虚基类对象的析构

    c++中,当继承结构中含有虚基类时,在构造对象时编译器会通过将一个标志位置1(表示调用虚基类构造函数),或者置0(表示不调用虚基类构造函数)来防止重复构造虚基类子对象.如下图菱形结构所示: 当构造类B ...

  3. Mysql常用命令行大全(转)

    第一招.mysql服务的启动和停止 net stop mysql net start mysql 第二招.登陆mysql 语法如下: mysql -u用户名 -p用户密码 键入命令mysql -uro ...

  4. git merge 分支

    把master merge到apple_campus1.git stash2.git checkout master3.git pull4.git checkout apple_campus5.git ...

  5. zabbix之3触发器/action及模板

    1.触发器: {server_name:item_name.func.operator.condition} 一旦condition(条件)触发,则item状态改变 触发器之间可以存在依赖关系,即it ...

  6. Effective Java从零开始 - 就是爱Java

    或许你已经开始写Java了,或许只是想要一窥这个的世界,无论是抱着何种心情来看Java,从零开始,会一种没有负担,没有包袱的事,你会发现写程序不再是枯燥乏味,孤单寂寞的一个人,而是生活中最快乐的学习之 ...

  7. Planner – 项目管理软件

    http://www.appinn.com/planner/   Planner 是一款开源.易用.跨平台的项目管理软件.@appinn 二猪用了 OpenProject 几年,现在已经受够了它的各种 ...

  8. Windows7里的“计算器”你真的会用吗?

    “计算器”是不同Windows版本中的必备工具,虽然功能单一,但的确是人们日常工作中不可缺少的辅助工具,本文就来谈谈它的使用. 一.标准型和科学型两种面板 我们既可从Windows附件菜单中启动它,也 ...

  9. Application.HookMainWindow完全替代了原来的窗口过程(但是好像也会继续传递)

    unit HookMain; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialo ...

  10. JavaScript为unicode编码转换为中文

    代码laycode - v1.1 关于这样的数据转换为中文问题,常用的以下方法. 1. eval解析或new Function("'+ str +'")()  str = eval ...