A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 熊鑫 中级黑马   /  2013-4-19 16:14  /  1292 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

string str=null  和 string str=""  一样不     不一样的话有什么区别。

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

7 个回复

倒序浏览
string str=null   是不给他分配空间的   
和 string str=""   分配 长度为0的空间!两者当然不一样!
前者没有值  后者是等于长度为0的字符串
回复 使用道具 举报
额,楼上回答完了~~ null没分配内存空间 空是有内存空间的~
而且数据库中的null是不知道的意思~~ 都不知道是个啥~~

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
NULL代表声明了一个空对象,根本就不是一个字符串。
""代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 王赟 于 2013-4-19 16:54 编辑

区别主要体现在编译器的检查上。在默认情况下,创建一个引用变量,CLR即将其初始化为null,表示不指向任何实例,所以本质上二者有相同的意义。

  1.            //编译器检测错误,使用了未赋值的obj
  2.             //object obj;

  3.             //编译器理解为执行了初始化操作,所以不引发编译时错误
  4.             object obj = null;
  5.             if (obj == null)
  6.             {
  7.                //运行时抛出NullReferenceException异常
  8.                 Console.WriteLine(obj.ToString());
  9.             }
复制代码
事实上,将
  1. static void Main(string[] args)
  2. {
  3.     object o;
  4.     object obj = null;
  5. }
复制代码
反编译为IL时,二者在IL还是存在一定差别的:
  1. .medthod private hidebysig void Main(string[] args) cil managed
  2. {
  3. .entrypoint
  4. .maxstack 1
  5. .locals init(
  6. [0] objcet o,
  7. [1] objcet obj)
  8. L_0000:nop
  9. L_0001:ldnull
  10. L_0002:stloc.l
  11. L_0003:ret
  12. }
复制代码
前者没有附加任何操作,后者通过一个ldnull指令推进一个空间给evaluation stack,而stloc则将空引用保留。

在.NET中,对null有如下规则和应用
1.null为引用类型变量的默认值,为引用类型的概念范畴。
2.null不等同归0 "" string.Empty,而表示一个空引用、
3.引用is或者as模式对类型进行判断和转换时,需要进一步对null进行检查。
4.判断一个变量师傅是null,可以用==或许!=等操作符来完成。
5.对任何值为null的变量操作,都会抛出NullReferenceException异常。

点评

{:3_54:}专业,留下足迹,学习下!  发表于 2013-4-19 19:29

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
1、string aa;和string aa = null;一样。
他么都是声明了一个sting对象的名字aa(可以理解为C\C++中指向sting类型变量的指针,或者说引用),但是并没有赋予aa一个与之对应的实际对象(没有内存分配)。所以aa在这里什么都不是,等待分配。
2、string aa = String.Empty;和string aa = "";以及string aa;aa="";是一样的。
aa被声明为一个空的字符串。实际上是aa在这里代表了一个内容为空字符串的字符串对象。
3、究竟前面两种情况在使用中有什么不一样呢?
前者由于没有指向具体对象,所以在没有将它指向具体对象之前,不能用“.”运算符引用string类对象的很多方法和属性。
但是后者就可以。
使用 Empty 常量值初始化字符串可新建字符串长度为零的 String 对象。零长度字符串的字符串表示形式为 ""。使用 Empty 值(而不是 null)初始化字符串可以降低发生 NullReferenceException 的可能性。
空字符串是不包含字符的 System.String 对象的实例。在各种编程方案中经常会使用空字符串表示空白文本字段。可以对空字符串调用方法,因为它们是有效的 System.String 对象。相反,null 字符串并不引用 System.String 对象的实例,任何对 null 字符串调用方法的尝试都会生成 NullReferenceException



评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
String是引用类型,String str=null 没有创建内存空间,str中存放的是空引用指针;
String str="" 创建了内存空间,str中存放的是指向堆的引用指针
回复 使用道具 举报
null就是不知道,""长度为0的字符串。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马