关于string a=null与string a=""
网上大部分人都是这样说的:null代表没有分配内存,但是""是分配了内存,在内存里存放了一个\0.但我想知道的是,c#中到底会不会给a这个指针变量在栈上分配内存。网上的回...
网上大部分人都是这样说的:null代表没有分配内存,但是""是分配了内存,在内存里存放了一个\0.
但我想知道的是,c#中到底会不会给a这个指针变量在栈上分配内存。网上的回答大部分的意思估计是说堆内存有没有分配,而且有的人甚至说""是在栈上分配了内存赋值为\0. 所以感觉他们是犯了严重错误呀。 展开
但我想知道的是,c#中到底会不会给a这个指针变量在栈上分配内存。网上的回答大部分的意思估计是说堆内存有没有分配,而且有的人甚至说""是在栈上分配了内存赋值为\0. 所以感觉他们是犯了严重错误呀。 展开
4个回答
展开全部
(1)解释:
string a=null ->创建一个变量a,但他没有初始化,因此没有任何值,又不等于空字符串值(就好象手上没有东西与拥有0个苹果这样的微弱语意差异,因为也可以类似地解释成拥有0个梨),微软把它叫做NULL,机器原理是它没有指向内存的某个位置,所以它不存在任何值
string a="" ->创建一个变量a,指向内存某个存储位置,并且该位置初始化有一个具体的字符串值,叫做空字符串,即""或\0(字符串结束符号,任何字符串最后都以\0做结束)
(2)比较:
既然a=null是未初始化,如果对它进行某些操作, 比如它和"ABC"连接, 会引起系统错误,因为它还没有分配内存给它,无法操作
但a=""就不会有引发系统错误,它和"ABC"连接后等于"ABC", 因为可以通过a对某个内存进行读取操作
(3)使用:
前面如果是a=null,后面要使用它,先直接赋值或赋指针就等于被初始化可以正常使用,
而在程序运行过程中,如果程序消耗内存比较大,那么我们要释放一些已不用的内存,如果a决定已不再用,那么可以用a=null来释放它原来占用的内存
string a=null ->创建一个变量a,但他没有初始化,因此没有任何值,又不等于空字符串值(就好象手上没有东西与拥有0个苹果这样的微弱语意差异,因为也可以类似地解释成拥有0个梨),微软把它叫做NULL,机器原理是它没有指向内存的某个位置,所以它不存在任何值
string a="" ->创建一个变量a,指向内存某个存储位置,并且该位置初始化有一个具体的字符串值,叫做空字符串,即""或\0(字符串结束符号,任何字符串最后都以\0做结束)
(2)比较:
既然a=null是未初始化,如果对它进行某些操作, 比如它和"ABC"连接, 会引起系统错误,因为它还没有分配内存给它,无法操作
但a=""就不会有引发系统错误,它和"ABC"连接后等于"ABC", 因为可以通过a对某个内存进行读取操作
(3)使用:
前面如果是a=null,后面要使用它,先直接赋值或赋指针就等于被初始化可以正常使用,
而在程序运行过程中,如果程序消耗内存比较大,那么我们要释放一些已不用的内存,如果a决定已不再用,那么可以用a=null来释放它原来占用的内存
追问
我想问a这个变量有没有分配内存。a是不是在栈上的。我不是问的a指向的对象有没有分配内存
展开全部
null的情况,是没有在堆上分配内存。在栈上,不管是不是null,就像你说的,是指针。始终占内存,不过会很小,也是不可避免的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
null分配了内存但没有值
""分配了内存且值为空
""分配了内存且值为空
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
既然把问题的分类归到“C#/.NET",就按.Net来说明
1)在.net中 String(或c#中的关键字string)是对象,所以String 的实例是引用类型(语义接近指针但不是指针);另外, String 对象实例是建立在堆上而不是栈上的。
2)string a = null的意思是:定义了一个名为 a 的string 引用,但这个引用没有与任何 string 的实例发送联系(关系),仅将这个引用 a 的初值设置为空(null)
3)string a = ""的意思与string a = null完全不同。在string a=""中,赋值号左边的 "" 的意思在堆上定义不含任何字符的String对象,并让a 引用这个对象。
4)在.net 中 String 实例中,结尾没有'\0', 这个与传统C或C++中的char * 完全不同
1)在.net中 String(或c#中的关键字string)是对象,所以String 的实例是引用类型(语义接近指针但不是指针);另外, String 对象实例是建立在堆上而不是栈上的。
2)string a = null的意思是:定义了一个名为 a 的string 引用,但这个引用没有与任何 string 的实例发送联系(关系),仅将这个引用 a 的初值设置为空(null)
3)string a = ""的意思与string a = null完全不同。在string a=""中,赋值号左边的 "" 的意思在堆上定义不含任何字符的String对象,并让a 引用这个对象。
4)在.net 中 String 实例中,结尾没有'\0', 这个与传统C或C++中的char * 完全不同
更多追问追答
追问
我想问a这个变量有没有分配内存。a是不是在栈上的。我不是问的a指向的对象有没有分配内存
追答
哦,这样要看 string a 出现在什么地方
1)如果在一个方法(函数)里,那么 a 在栈中;
2)如果 string a 作为一个类内部,因为类实例是在堆上,所以 a 也在堆上
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询