2023年6月21日发(作者:)

C#中NULL,"",DBNULL,,ll()的区别就相当于""一般用于字符串的初始化比如:stringa;ine(a);//这里会报错,因为没有初始化a而下面不会报错:stringa=;ine(a);或者用于比较:if(a=="")if(a==)上面两句是一样的效果。不分配存储空间""分配一个长度为空的存储空间所以一般用为了以后跨平台,还是用在C#中,大多数情况下""和可以互换使用。比如:strings="";strings2=;if(s==){//}if语句成立和Null,这两个都是表示空字符串,stringstr1=,这样定义后,str1是一个空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的,stringstr2=null,这样定义后,只是定义了一个string类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,都将报错。的值为零长度字符串""。判定为空字符串的几种写法,按照性能从高到低的顺序是:==0优于s==优于s==""判断字符串是否为空最好的方法就是==0!C#中的空值的判断较麻烦,不象在VB6中那么简单,这些各种空值的判断和理解对不熟悉的人来说,可能很麻烦,现就我在使用过程中的一点体会和大家共同分享。(1)NULLnull关键字是表示不引用任何对象的空引用的文字值。null是引用类型变量的默认值。那么也只有引用型的变量可以为NULL,如果inti=null,的话,是不可以的,因为Int是值类型的。(2)DBNULLDBNull在DotNet是单独的一个类型,该类只能存在唯一的实例,,DBNull唯一作用是可以表示数据库中的字符串,数字,或日期,为什么可以表示原因是DotNet储存这些数据的类(DataRow等)都是以object的形式来储存数据的。对于DataRow,它的row[column]返回的值永远不为null,要么就是具体的为column的类型的值。要么就是DBNull。所以row[column].ToString()这个写法永远不会在ToString那里发生NullReferenceException。DBNull实现了IConvertible。但是,除了ToString是正常的外,其他的ToXXX都会抛出不能转换的错误。(3)""和这两个都是表示空字符串,其中有一个重点是stringstr1=""和stringstr2=null的区别,这样定义后,str1是一个空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的,stringstr2=null,这样定义后,只是定义了一个string类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,都将抱错。(4)ll()ll()返回有关指定对象是否为DBNull类型的指示,即是用来判断对象是否为DBNULL的。其返回值是True或Flase。好了说了这么多,也不知道说明白了没有,其实这些广义上的"空值"理解了后,还是有很大的区别的,甚至根本就没有关系。完全是两个概念。==================================================================================1.对DBNull的解释:该类用于指示不存在某个已知值(通常在数据库应用程序中)。在数据库应用程序中,空对象是字段的有效值。该类区分空值(空对象)和未初始化值(实例)。例如,表可以包含具有未初始化字段的记录。默认情况下,这些未初始化字段具有DBNull值。该类还可以用于在COMInterop中区分VT_NULL变量(与空对象关联)和VT_EMPTY变量(与实例关联)。DBNull从不等于任何值。DBNull是一个单独的类,这意味着该类只能存在一个实例。这个唯一的实例是。访问SQL数据库的数据密集应用程序必须使用些类对空值具有内在支持。es类,这DBNull在DotNet是单独的一个类型,该类只能存在唯一的实例,,DBNull唯一作用是可以表示数据库中的字符串,数字,或日期,为什么可以表示原因是DotNet储存这些数据的类(DataRow等)都是以object的形式来储存数据的。对于DataRow,它的row[column]返回的值永远不为null,要么就是具体的为column的类型的值。要么就是DBNull。所以row[column].ToString()这个写法永远不会在ToString那里发生NullReferenceException。DBNull实现了IConvertible。但是,除了ToString是正常的外,其他的ToXXX都会抛出不能转换的错误。ll关键字是表示不引用任何对象的空引用的文字值。null是引用类型变量的默认值。那么也只有引用型的变量可以为NULL,如果inti=null,的话,是不可以的,因为Int是值类型的。"null",whenyouretrieveaNULLvaluefromtheDatabase,,ull用于判断Referenceinvalidate3.""和这两个都是表示空字符串,其中有一个重点是stringstr1=""和stringstr2=null的区别,这样定义后,str1是一个空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的,stringstr2=null,这样定义后,只是定义了一个string类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,都将报错。ll()ll()返回有关指定对象是否为DBNull类型的指示,即是用来判断对象是否为DBNULL的。其返回值是True或Flase。DBNull在DotNet是单独的一个类型。它只有一个值。DBNull直接继承Object,所以DBNull不是string,不是int,也不是DateTime。。。但是为什么DBNull可以表示数据库中的字符串,数字,或日期呢?原因是DotNet储存这些数据的类(DataRow等)都是以object的形式来储存数据的。对于DataRow,它的row[column]返回的值永远不为null,要么就是具体的为column的类型的值。要么就是DBNull。所以row[column].ToString()这个写法永远不会在ToString那里发生NullReferenceException。DBNull实现了IConvertible。但是,除了ToString是正常的外,其他的ToXXX都会抛出不能转换的错误。在IDbCommand()的ExecuteScalar的返回值中,情况可以这样分析:select1这样返回的object是1selectnull这样返回的是electisnull(null,1)返回的是1selecttop0idfromtable1这样返回的值是nullselectisnull(id,0)fromtable1where1=0返回的值是null这里ExecuteScalar的规则就是,返回第一列,第一行的数据。如果第一列第一行不为空,那么ExecuteScalar就直接对应的DotNet的值。如果有第一行,但是第一列为空,那么返回的是DBNull。如果一行都没有,那么ExecuteScalar就返回null规则就是这样的。这里容易犯的一个错误是,把ExecuteScalar返回DBNull与null的情况混淆,例如:stringusername=eScalar().ToString();除非你认为cmd执行后,肯定至少有一行数据,否则这里就会出错。又或者selectidfromusertablewhereusername=@name这样的sql语句,如果找不到记录,那么ExecuteScalar则会返回null,所以千万不要intuserid=32(eScalar());或者你会这样写SQL语句:selectisnull(id,0)fromusertablewhereusername=@name但是intuserid=32(eScalar());依然会出错,因为上面的语句不成立时,仍然是不返回任何行。对于IDbDataParameter(OleDDbParameter,SqlParameter..)的Value,如果为null,则代表该参数没有指定,或者是代表DEFAULT。如果为,则代表SQL中的NULL所以,如果你要调用存储过程,里面有参数@valnvarchar(20)="AABB",那么ters["@val"].Value=null代表使用这个默认的"AABB"而ters["@val"].Value=代表使用NULL来传给@val你可以用ll来判断一个值是否DBNull。注意ll(null)是false。==================================================================================null是C#关键字,是表示不引用任何对象的空引用的文字值。null是引用类型变量的默认值。那么也只有引用型的变量可以为NULL,如果inti=null,的话,是不可以的,因为Int是值类型的。就相当于"",但他俩和NULL是两码事。据说是:不分配存储空间""分配一个长度为空的存储空间所以比""效率要高点。(效率高是对的,但是到底是否分配存储空间,还不明确,待核实)一个外国人做了一个测试,测试的对象有5种,分别是:s==“”s==(”")()==0通过下列的测试代码(如要看请点击下面的加号),判断谁的效率更高~最后得到测试的结果如下:[s==""]空字符串,10315.6250毫秒短字符串,8307.8125毫秒长字符串,8564.0625毫秒[s==]空字符串,3573.4375毫秒短字符串,8307.8125毫秒长字符串,8603.1250毫秒[("")]空字符串,9517.1875毫秒短字符串,7537.5000毫秒长字符串,7576.5625毫秒[()]空字符串,9540.6250毫秒短字符串,7515.6250毫秒长字符串,7607.8125毫秒[==0]空字符串,443.7500毫秒短字符串,null是C#关键字,是表示不引用任何对象的空引用的文字值。null是引用类型变量的默认值。那么也只有引用型的变量可以为NULL,如果inti=null,的话,是不可以的,因为Int是值类型的。就相当于"",但他俩和NULL是两码事。据说是:不分配存储空间""分配一个长度为空的存储空间所以比""效率要高点。(效率高是对的,但是到底是否分配存储空间,还不明确,待核实)一个外国人做了一个测试,测试的对象有5种,分别是:s==“”s==(”")()==0通过下列的测试代码(如要看请点击下面的加号),判断谁的效率更高~最后得到测试的结果如下:[s==""]空字符串,10315.6250毫秒短字符串,8307.8125毫秒长字符串,8564.0625毫秒[s==]空字符串,3573.4375毫秒短字符串,8307.8125毫秒长字符串,8603.1250毫秒[("")]空字符串,9517.1875毫秒短字符串,7537.5000毫秒长字符串,7576.5625毫秒[()]空字符串,9540.6250毫秒短字符串,7515.6250毫秒长字符串,7607.8125毫秒[==0]空字符串,443.7500毫秒短字符串,443.7500毫秒长字符串,445.3125毫秒很明显用字符串的length属性是最快的。得到以下结论:用("stringtocompare")来判断非空字符串是否相等,用==0来判断是否是空字符串(注意这里不能用这个来判断字符串为NULL的情况,否则会出现“未将对象引用设置到对象的实例”的错误)。在2.0中判断字符串是否为空(包含NULL的情况)用OrEmpty(str);443.7500毫秒长字符串,445.3125毫秒很明显用字符串的length属性是最快的。得到以下结论:用("stringtocompare")来判断非空字符串是否相等,用==0来判断是否是空字符串(注意这里不能用这个来判断字符串为NULL的情况,否则会出现“未将对象引用设置到对象的实例”的错误)。在2.0中判断字符串是否为空(包含NULL的情况)用OrEmpty(str);

2023年6月21日发(作者:)

C#中NULL,"",DBNULL,,ll()的区别就相当于""一般用于字符串的初始化比如:stringa;ine(a);//这里会报错,因为没有初始化a而下面不会报错:stringa=;ine(a);或者用于比较:if(a=="")if(a==)上面两句是一样的效果。不分配存储空间""分配一个长度为空的存储空间所以一般用为了以后跨平台,还是用在C#中,大多数情况下""和可以互换使用。比如:strings="";strings2=;if(s==){//}if语句成立和Null,这两个都是表示空字符串,stringstr1=,这样定义后,str1是一个空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的,stringstr2=null,这样定义后,只是定义了一个string类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,都将报错。的值为零长度字符串""。判定为空字符串的几种写法,按照性能从高到低的顺序是:==0优于s==优于s==""判断字符串是否为空最好的方法就是==0!C#中的空值的判断较麻烦,不象在VB6中那么简单,这些各种空值的判断和理解对不熟悉的人来说,可能很麻烦,现就我在使用过程中的一点体会和大家共同分享。(1)NULLnull关键字是表示不引用任何对象的空引用的文字值。null是引用类型变量的默认值。那么也只有引用型的变量可以为NULL,如果inti=null,的话,是不可以的,因为Int是值类型的。(2)DBNULLDBNull在DotNet是单独的一个类型,该类只能存在唯一的实例,,DBNull唯一作用是可以表示数据库中的字符串,数字,或日期,为什么可以表示原因是DotNet储存这些数据的类(DataRow等)都是以object的形式来储存数据的。对于DataRow,它的row[column]返回的值永远不为null,要么就是具体的为column的类型的值。要么就是DBNull。所以row[column].ToString()这个写法永远不会在ToString那里发生NullReferenceException。DBNull实现了IConvertible。但是,除了ToString是正常的外,其他的ToXXX都会抛出不能转换的错误。(3)""和这两个都是表示空字符串,其中有一个重点是stringstr1=""和stringstr2=null的区别,这样定义后,str1是一个空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的,stringstr2=null,这样定义后,只是定义了一个string类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,都将抱错。(4)ll()ll()返回有关指定对象是否为DBNull类型的指示,即是用来判断对象是否为DBNULL的。其返回值是True或Flase。好了说了这么多,也不知道说明白了没有,其实这些广义上的"空值"理解了后,还是有很大的区别的,甚至根本就没有关系。完全是两个概念。==================================================================================1.对DBNull的解释:该类用于指示不存在某个已知值(通常在数据库应用程序中)。在数据库应用程序中,空对象是字段的有效值。该类区分空值(空对象)和未初始化值(实例)。例如,表可以包含具有未初始化字段的记录。默认情况下,这些未初始化字段具有DBNull值。该类还可以用于在COMInterop中区分VT_NULL变量(与空对象关联)和VT_EMPTY变量(与实例关联)。DBNull从不等于任何值。DBNull是一个单独的类,这意味着该类只能存在一个实例。这个唯一的实例是。访问SQL数据库的数据密集应用程序必须使用些类对空值具有内在支持。es类,这DBNull在DotNet是单独的一个类型,该类只能存在唯一的实例,,DBNull唯一作用是可以表示数据库中的字符串,数字,或日期,为什么可以表示原因是DotNet储存这些数据的类(DataRow等)都是以object的形式来储存数据的。对于DataRow,它的row[column]返回的值永远不为null,要么就是具体的为column的类型的值。要么就是DBNull。所以row[column].ToString()这个写法永远不会在ToString那里发生NullReferenceException。DBNull实现了IConvertible。但是,除了ToString是正常的外,其他的ToXXX都会抛出不能转换的错误。ll关键字是表示不引用任何对象的空引用的文字值。null是引用类型变量的默认值。那么也只有引用型的变量可以为NULL,如果inti=null,的话,是不可以的,因为Int是值类型的。"null",whenyouretrieveaNULLvaluefromtheDatabase,,ull用于判断Referenceinvalidate3.""和这两个都是表示空字符串,其中有一个重点是stringstr1=""和stringstr2=null的区别,这样定义后,str1是一个空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的,stringstr2=null,这样定义后,只是定义了一个string类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,都将报错。ll()ll()返回有关指定对象是否为DBNull类型的指示,即是用来判断对象是否为DBNULL的。其返回值是True或Flase。DBNull在DotNet是单独的一个类型。它只有一个值。DBNull直接继承Object,所以DBNull不是string,不是int,也不是DateTime。。。但是为什么DBNull可以表示数据库中的字符串,数字,或日期呢?原因是DotNet储存这些数据的类(DataRow等)都是以object的形式来储存数据的。对于DataRow,它的row[column]返回的值永远不为null,要么就是具体的为column的类型的值。要么就是DBNull。所以row[column].ToString()这个写法永远不会在ToString那里发生NullReferenceException。DBNull实现了IConvertible。但是,除了ToString是正常的外,其他的ToXXX都会抛出不能转换的错误。在IDbCommand()的ExecuteScalar的返回值中,情况可以这样分析:select1这样返回的object是1selectnull这样返回的是electisnull(null,1)返回的是1selecttop0idfromtable1这样返回的值是nullselectisnull(id,0)fromtable1where1=0返回的值是null这里ExecuteScalar的规则就是,返回第一列,第一行的数据。如果第一列第一行不为空,那么ExecuteScalar就直接对应的DotNet的值。如果有第一行,但是第一列为空,那么返回的是DBNull。如果一行都没有,那么ExecuteScalar就返回null规则就是这样的。这里容易犯的一个错误是,把ExecuteScalar返回DBNull与null的情况混淆,例如:stringusername=eScalar().ToString();除非你认为cmd执行后,肯定至少有一行数据,否则这里就会出错。又或者selectidfromusertablewhereusername=@name这样的sql语句,如果找不到记录,那么ExecuteScalar则会返回null,所以千万不要intuserid=32(eScalar());或者你会这样写SQL语句:selectisnull(id,0)fromusertablewhereusername=@name但是intuserid=32(eScalar());依然会出错,因为上面的语句不成立时,仍然是不返回任何行。对于IDbDataParameter(OleDDbParameter,SqlParameter..)的Value,如果为null,则代表该参数没有指定,或者是代表DEFAULT。如果为,则代表SQL中的NULL所以,如果你要调用存储过程,里面有参数@valnvarchar(20)="AABB",那么ters["@val"].Value=null代表使用这个默认的"AABB"而ters["@val"].Value=代表使用NULL来传给@val你可以用ll来判断一个值是否DBNull。注意ll(null)是false。==================================================================================null是C#关键字,是表示不引用任何对象的空引用的文字值。null是引用类型变量的默认值。那么也只有引用型的变量可以为NULL,如果inti=null,的话,是不可以的,因为Int是值类型的。就相当于"",但他俩和NULL是两码事。据说是:不分配存储空间""分配一个长度为空的存储空间所以比""效率要高点。(效率高是对的,但是到底是否分配存储空间,还不明确,待核实)一个外国人做了一个测试,测试的对象有5种,分别是:s==“”s==(”")()==0通过下列的测试代码(如要看请点击下面的加号),判断谁的效率更高~最后得到测试的结果如下:[s==""]空字符串,10315.6250毫秒短字符串,8307.8125毫秒长字符串,8564.0625毫秒[s==]空字符串,3573.4375毫秒短字符串,8307.8125毫秒长字符串,8603.1250毫秒[("")]空字符串,9517.1875毫秒短字符串,7537.5000毫秒长字符串,7576.5625毫秒[()]空字符串,9540.6250毫秒短字符串,7515.6250毫秒长字符串,7607.8125毫秒[==0]空字符串,443.7500毫秒短字符串,null是C#关键字,是表示不引用任何对象的空引用的文字值。null是引用类型变量的默认值。那么也只有引用型的变量可以为NULL,如果inti=null,的话,是不可以的,因为Int是值类型的。就相当于"",但他俩和NULL是两码事。据说是:不分配存储空间""分配一个长度为空的存储空间所以比""效率要高点。(效率高是对的,但是到底是否分配存储空间,还不明确,待核实)一个外国人做了一个测试,测试的对象有5种,分别是:s==“”s==(”")()==0通过下列的测试代码(如要看请点击下面的加号),判断谁的效率更高~最后得到测试的结果如下:[s==""]空字符串,10315.6250毫秒短字符串,8307.8125毫秒长字符串,8564.0625毫秒[s==]空字符串,3573.4375毫秒短字符串,8307.8125毫秒长字符串,8603.1250毫秒[("")]空字符串,9517.1875毫秒短字符串,7537.5000毫秒长字符串,7576.5625毫秒[()]空字符串,9540.6250毫秒短字符串,7515.6250毫秒长字符串,7607.8125毫秒[==0]空字符串,443.7500毫秒短字符串,443.7500毫秒长字符串,445.3125毫秒很明显用字符串的length属性是最快的。得到以下结论:用("stringtocompare")来判断非空字符串是否相等,用==0来判断是否是空字符串(注意这里不能用这个来判断字符串为NULL的情况,否则会出现“未将对象引用设置到对象的实例”的错误)。在2.0中判断字符串是否为空(包含NULL的情况)用OrEmpty(str);443.7500毫秒长字符串,445.3125毫秒很明显用字符串的length属性是最快的。得到以下结论:用("stringtocompare")来判断非空字符串是否相等,用==0来判断是否是空字符串(注意这里不能用这个来判断字符串为NULL的情况,否则会出现“未将对象引用设置到对象的实例”的错误)。在2.0中判断字符串是否为空(包含NULL的情况)用OrEmpty(str);