C# null,string.Empty,"",DBNull 的区别
【null】
null 在C# 中是一个关键字,表示不引用任何对象的空引用的文字值。 null 是引用类型变量的默认值。 普通值类型不能为 null。
null 在 VS 中定位不出来具体是怎么定义的。一般通过类名映射过来的关键字,都可以定位到声明位置。所以null是比较特殊的。
这个东西要跟踪源头还比较麻烦,感觉找不到具体定义。
MSDN上说明很简单:null 关键字是表示不引用任何对象的空引用的文字值。 null 是引用类型变量的默认值。 普通值类型不能为 null。
stock overflow 上有一段回答:
There are three things in C# that "null" can be. A reference, a pointer, and a nullable type.
The implementation of C# on the CLR represents a null reference by zero bits. (Where the number of bits is the appropriate size to be a managed pointer on the particular version of the CLR that you're running.)
Unsurprisingly, a null pointer is represented the same way. You can demonstrate this in C# by making an unsafe block, making a null pointer to void, and then converting that to IntPtr, and then converting the IntPtr to int (or long, on 64 bit systems). Sure enough, you'll get zero.
以下翻译(来自Google在线翻译):
C#中有三个“null”可以。 引用,指针和可空类型。
CLR上的C#实现表示零位的空引用。 (其中位数是适合您正在运行的CLR的特定版本上的托管指针的大小。)
不出所料,空指针以相同的方式表示。 您可以在C#中通过创建一个不安全的块,将空指针转换为void,然后将其转换为IntPtr,然后将IntPtr转换为int(或64位系统上的long)来证明这一点。 果然,你会得到零。
Stack Overflow 上的这个回答是基本从比较底层说明的。
那么咱们也从相对比较底层看下c/c++中null的定义。
来自 https://zh.cppreference.com/w/c/types/NULL
C:

C++

【string.Empty】
这个是 string 类中的一个制度静态变量。也就肯定的说明了 string.Empty 是一个存在静态对象。这个就跟 null 区别开了。那到底具体是个什么呢?
string.Empty 其实就是 “”。

MSDN解释:

https://docs.microsoft.com/zh-cn/dotnet/api/system.string.empty?view=netframework-4.7.2
string.Empty 虽然跟 “” 是相等的,但是一般在给 string 初始化为空字符串的时候,一般建议用string.Empty,因为“”在赋值给string对象的时候,是你新创建了一个空字符串,而用Empty是将你的字符串对象指向了全局的只读的空字符串,这样相对来说性能能优化一些。
【“”】
“” 代表一个空字符串。什么意思,首先是一个字符串对象,但是特殊的是,这个字符串没有内容,这可绝非 null。
个人经验简单形容下 null 和 “”。引用类型好比书目录,类对象好比书中内容。如果引用类型不为null,那么目录后面就有页码,如果为null,那么目录后面的页码就为0或者没有页码。那么没有页码,你说这个目录怎么找页数,也就是空引用了。
【DBNull】
咱先看MSDN注解:
DBNull类表示不存在的值。 例如,在数据库中,表的行中的列不可能包含任何数据。 也就是说,列被视为根本不存在,而不是只是不具有值。 一个DBNull对象都表示不存在的列。 此外,COM 互操作使用DBNull类,以区分 VT_NULL 变体,用于指示不存在的值和 VT_EMPTY 变体,用于指示未指定的值。
DBNull类型是一个单一实例类,这意味着只有一个DBNull对象存在。 DBNull.Value成员表示单独DBNull对象。 DBNull.Value 可用于显式将不存在的值分配到数据库字段中,尽管大多数的 ADO.NET 数据提供程序自动分配的值DBNull字段没有有效的值。 您可以确定从数据库字段中检索某个值是否DBNull通过将为该字段的值传递值DBNull.Value.Equals方法。 但是,某些语言和数据库对象提供一些方法,使其更轻松地确定数据库字段的值是否为DBNull.Value。 其中包括 Visual BasicIsDBNull函数,Convert.IsDBNull方法,DataTableReader.IsDBNull方法,和IDataRecord.IsDBNull方法。
不要混淆这一概念null在面向对象的编程语言与DBNull对象。 在面向对象的编程语言中,null表示不存在的对象的引用。 DBNull 表示一个未初始化的变量或不存在的数据库列。
从上面注解可以看出,DBNull只要用在数据库和COM互操作中。而DBNull中有个Value字段,这个字段是一个静态只读字段,也就是全局唯一静态DBNull对象,不是null。
当我们在用ADO.NET操作数据库时,遇到数据库返回字段值为NULL时,就需要用DBNull来判断,而不能用null来判断。
看看MSDN对DBNull.Value的注解:
DBNull 是一个单一实例类,这意味着可以存在此类的此实例。
如果数据库字段有缺失数据,则可以使用DBNull.Value属性来显式分配DBNull对象的字段的值。 但是,大多数数据访问接口自动执行此操作。
若要评估的数据库字段,以确定它们的值是否DBNull,可以将传递到的字段值DBNull.Value.Equals方法。 但是,很少使用此方法,因为有多种其他方法来评估缺少数据的数据库字段。 其中包括 Visual BasicIsDBNull函数,Convert.IsDBNull方法,DataTableReader.IsDBNull方法,IDataRecord.IsDBNull方法和其他几种方法。
所以这下就明白了吧,这就是为什么我们用IDataReader读取数据库字段信息时,要用DBNull.Value来判断是否为空,然后在转换或者其他操作。
https://docs.microsoft.com/zh-cn/dotnet/api/system.dbnull.value?view=netframework-4.7.2
C# null,string.Empty,"",DBNull 的区别的更多相关文章
- C# String.Empty和""的区别
个人观点 Empty其实是string类中的一个静态的只读字段,因为是静态成员变量,所以String.Empty是在设计String类的时候就已经在内存上分配好了空间,故在使用Empty这个变量的时候 ...
- VB中判断空的几种方法,Null, Missing, Empty, Nothing, vbNullString区别
vb6中存在几个虚幻的值:Null.Missing.Empty.Nothing.vbNullString.除了最后一个之外,每一个值都不能直接用“a=值”来判断.下面分别解释一下这几个值的含义. 1. ...
- string.IsNullOrEmpty和string.IsNullOrWhiteSpace方法的区别
string.IsNullOrEmpty 都知道,这个功能是判断字符串是否为:null或者string.Empty.如果是如"\t"这样的字符就返回false了,为了达到判断过滤这 ...
- C#中NULL,"",DBNULL,String.Empty,Convert.IsDBNull()的区别
C#中的空值的判断较麻烦,不象在VB6中那么简单,这些各种空值的判断和理解对不熟悉的人来说,可能很麻烦,现就我在使用过程中的一点体会和大家共同分享. (1)NULL null 关键字是表示不引用任何对 ...
- C#中的DBNull、Null、""和String.Empty
1.对DBNull的解释: 该类用于指示不存在某个已知值(通常在数据库应用程序中). 在数据库应用程序中,空对象是字段的有效值.该类区分空值(空对象)和未初始化值(DBNull.Va ...
- String.Empty,NULL和""的区别
String.Empty,NULL和""的区别 string.Empty就相当于"" 一般用于字符串的初始化 比如: string a; Console.Wri ...
- string.empty和null的区别
关于String.Empty和Null的问题是这样的,这两个都是表示空字符串,其中有一个重点是string str1= String.Empty和 string str2=null 的区别,这样定义后 ...
- C#中string.Empty ,"" , null 区别
引言 String类型作为使用最频繁的类型之一,相信大家都非常熟悉,对于string赋予空值,通常有以下三种方式: String str1=null; String str2=””; String s ...
- C# 中 string.Empty、""、null的区别
原文C# 中 string.Empty."".null的区别 一.string.Empty 和 "" 1.Empty是string类中的一个静态的只读字段,它是 ...
随机推荐
- Eclipse 中 program arguments 与 VM arguments 的区别
1. program arguments 中的值作为 主函数中的参数args[] 传入 2. VM Arguments 是设置的java虚拟机的属性,这些系统属性都以-D开头, VM argument ...
- Oracle数据库迁移的几种方式
面试: 一.exp/imp逻辑备份与恢复: 二.Storage存储迁移: 将数据文件.控制文件.日志文件.spfile挂到新机器上,然后在新机器上启动数据库. 三.利用data guard迁移: 四. ...
- php多进程 防止出现僵尸进程
对于用PHP进行多进程并发编程,不可避免要遇到僵尸进程的问题. 僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程(zombie)进程.任何进程在退出前(使用exit退出) ...
- 在控制台远程连接mysql数据库时,出现ERROR 2049 (HY000)错误
问题的原因是,你本地的数据库版本过高,而远程的数据库版本低. 解决方法:在连接时加上 --skip-secure-auth 参数就可以了. mysql -h主机 -u用户名 -p密码 --skip- ...
- nginx 反向代理 apache 服务
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时 ...
- Spring框架的AOP的底层实现
1. Srping框架的AOP技术底层也是采用的代理技术,代理的方式提供了两种 1. 基于JDK的动态代理 * 必须是面向接口的,只有实现了具体接口的类才能生成代理对象 2. 基于CGLIB动态代理 ...
- PL/Sql快速执行 insert语句的.sql文件
当全是 insert语句的.sql文件太大时(insert 语句条数太大),直接打开执行sql文件,pl/sql会卡死. 这是可以用pl/sql的命令窗口来执行.sql文件,操作步骤如下: 1.新建命 ...
- VisulaVM 性能:分析 JVM 性能的免费工具
VisualVM是一个集成多个JDK命令行工具的可视化工具.可以作为Java应用程序性能分析和运行监控的工具.开发人员可以利用它来监控.分 析线程信息,浏览内存堆数据.系统管理员可以利用它来监测.控制 ...
- Telnet 协议详解
Telnet 协议详解 一.概述 ============================================================ Telnet 协议是 TCP/IP 协议族中 ...
- wpf 进度条 下拉
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsof ...