问题描述
Strings="a"+"b"+"c"产生了几个对象?这样的面试题目,我不能确定,大家有没有看法,解释的清除一点
解决方案
解决方案二:
sa+ba+b+c应该是3个
解决方案三:
我觉得是六个吧abca+ba+b+cs不确定对不对。
解决方案四:
好像是1个吧
解决方案五:
abc分别作为字符串来进行传递拼接,我觉得不应该单独作为对象。--不知道,高手来回答咯
解决方案六:
一个abc
解决方案七:
一个.methodpublichidebysigstaticvoidMain()cilmanaged{.entrypoint//Codesize15(0xf).maxstack1.localsinit([0]strings)IL_0000:nopIL_0001:ldstr"abc"IL_0006:stloc.0IL_0007:ldloc.0IL_0008:callvoid[mscorlib]System.Console::WriteLine(string)IL_000d:nopIL_000e:ret}//endofmethodProgram::Main
解决方案八:
我自己也拿不准。帮顶……
解决方案九:
我觉得应该是6个,同意2楼
解决方案十:
楼上的兄弟,这段代码要怎么才能看到
解决方案十一:
onlyone...
解决方案十二:
一个内存就分了一块空间的只不过这个空间里的值变化了而已!
解决方案十三:
One..
解决方案十四:
转到汇编状态看以看到那个东西最基本的原理:String的内容是不可变的!这是最基础的东西。
解决方案十五:
FIVE请参考c#高级编程一书。
解决方案:
c#高级编程第二章string类型14楼说错了
解决方案:
呵呵不是说错说漏了
解决方案:
1个abc
解决方案:
六个因为字符串储存在静态储存区,其值是不可被修改的,而对字符的每一次操作实际上都新建立了一个对象,然后再将引用指向该对象a,b,c和s四个a+b时有一个(a+b)+c再有一个这样就是六个了
解决方案:
Mark
解决方案:
1个STRING类跟INT等相比有点特殊,但这里是一个对象“ABC”
解决方案:
什么叫"几个对象"?定义一个strings;//这算一个对象的话.那么"a"+"b"+"c";//这里,据说会被编译优化成一个字符串"abc",那么是不是只算一个对象.那么总共是不是两上对象.偶不太懂的,只是说说自己想法,欢迎拍砖~~
解决方案:
关注
解决方案:
关注
解决方案:
String对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的值。看来似乎修改了String对象的方法实际上是返回一个包含修改内容的新String对象。如果需要修改字符串对象的实际内容,请使用System.Text.StringBuilder类。因此,当你需要大量拼接、删除、修改字符创使,用StringBuilder可以优化性能我觉得应该是4个,s、a、b、c,因为string类型的做+的时候还是会生成一个临时的字符串,所以应该就是4个,如果是stringbulid类型就是一个。
解决方案:
后来一想好像错了,因为s+a之后又生成了一个新的对象,新的字符串,所以是6个,没有想到,脑袋湖了。赫赫
解决方案:
1个
解决方案:
同意2楼的string是个假引用类型,它更象个值类型!
解决方案:
1个
解决方案:
sabcabc
解决方案:
最好的软件开发交流QQ群[37934302]欢迎大家进来切磋切磋![IT精英进]
解决方案:
这种代码,编译器应该直接直接优化成一个的
解决方案:
一个吧投票解决~
解决方案:
要解答这个问题,需要好好看下String跟StringBuilder的区别。s="a"+"b"+"c";//这种编译器可以直接优化。这种是创建3次对象跟s1="a";s2="b";s3="c";s=s1+s2+s3是两个不同的概念;这种是6次对象String对象是不可改变的。每次使用System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的String对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder类。例如,当在一个循环中将许多字符串连接在一起时,使用StringBuilder类可以提升性能。
解决方案:
我感觉理论上是6个,但如果编译器对这种表达式进行优化的话,那就不一定了。
解决方案:
在.NET框架和通用语言运行时刻(CLR)以前,开发者总是花费大量时间处理字符串。一个字符串例程可重用库几乎是每一个C和C++程序员的工具箱中的一部分。编写在不同程序语言之间交换字符串数据的代码也是相当困难的。例如,Pascal把字符串存储为一个内存字符数组,其中,该数组的第一个元素指示字符串的长度;而C把字符串存储为一个具有可变长度的字符内存数组,字符串的末端加上一个ASCIInull字符(在C中以""表示)。 在.NET框架中,字符串以常量方式存储。这意味着,当你用C#(或任何其它.NET语言)创建一个字符串时,该字符串以一种固定大小存储在内存以便CLR运行更快些。结果是,当你实现例如连接字符串或修改一个字符串中的单个字符时,CLR实际上是创建你的字符串的多个副本。根据这个话来看,应该是6个
解决方案:
编译器应该优化成一个.
解决方案:
一个!!
解决方案:
理论上说应该是6个。
解决方案:
4个
解决方案:
如果是strings1="a",s2="b",s3="c";s4=s1+s2+s3;的话应该是5个对象不知道s="a"+"b"+"c";这种形式会不会被编译器优化。
解决方案:
6楼的说的好,都给出了IL像这样定义:Strings="a"+"b"+"c"优化的小事编译器都帮你做好了。
解决方案:
hertcloud-->编译器应该优化成一个.同意这个,好像原来看见java区也问过这个问题,好像正确的也是1个,编译器会做优化的根据6楼的ilcode也可以看出来是1个.methodpublichidebysigstaticvoidMain()cilmanaged{.entrypoint//Codesize15(0xf).maxstack1.localsinit([0]strings)IL_0000:nopIL_0001:ldstr"abc"IL_0006:stloc.0IL_0007:ldloc.0IL_0008:callvoid[mscorlib]System.Console::WriteLine(string)IL_000d:nopIL_000e:ret}//endofmethodProgram::Main
解决方案:
5个
解决方案:
6个
解决方案:
6个
解决方案:
"a""b""c""ab""abc"s这6个
解决方案:
一个吧
解决方案:
优化成一个只是给你优化之后的感觉实习上是6个
解决方案:
.methodprivatehidebysigstaticvoidMain(string[]args)cilmanaged{.entrypoint//代码大小8(0x8).maxstack1.localsinit([0]strings)IL_0000:nopIL_0001:ldstr"abc"IL_0006:stloc.0IL_0007:ret}//endofmethodProgram::Main对于编译器来说只是一个,内存是分配置了6次
解决方案:
不要瞎扯什么6个了编译以后汇编代码是1个就是1个,实际运行的是IL代码,不是c#程序