循环体里面用string 还是stringbuilder

shanyang1 2013-04-19 09:24:38
string aaa = "";

while(true)
{

aaa = StrReceiveFromNet();
if(string.compare("quit",aaa) == 0)
{
break;
}
}
这样写行不行?占用内存会不会无限增大
stringbuilder是否好些
...全文
459 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
dreay-style 2013-04-22
  • 打赏
  • 举报
回复
没必要啊,这样就挺好的,SringBuilder在处理字符串相加的时候要比String好些,你这是赋值,又不是字符串拼接
幽冥雨丝 2013-04-22
  • 打赏
  • 举报
回复
应该不会吧,
我要坚强 2013-04-22
  • 打赏
  • 举报
回复
自我总结,代码中凡是相同的string值 CLR 会帮我们只指向同一块托管堆,不会重复产生实例
我要坚强 2013-04-22
  • 打赏
  • 举报
回复
 if (i > 10000000)
                return "quit";
            else
                return i.ToString();
也要回收200多次,不过比sb.Equals(sb2) StringBuilder快一半时间
我要坚强 2013-04-22
  • 打赏
  • 举报
回复
引用 11 楼 sp1234 的回复:
你这个代码要是使用StringBuilder反而是非常荒唐的事情了,反而是多做了很多工作。正如上面很多人已经指出的,又没有连接复制字符串,谈不上什么StringBuilder啊?!
正解 我特意自己测了一下
class Program
    {
        static int i = 0;
        //  static string bbb;
        static void Main(string[] args)
        {

            StringBuilder sb = new StringBuilder();
            string aaa = "";

            GC.Collect();
            while (true)
            {
                // bbb += aaa;
                aaa = StrReceiveFromNet();
                if (string.Compare("quit", aaa) == 0)
                {
                    break;
                }
            }
            Console.WriteLine("垃圾回收次数:{0},内存{1}", GC.CollectionCount(0), GC.GetTotalMemory(false));
            Console.ReadKey();

        }
        static string StrReceiveFromNet()
        {
            i++;

            if (i > 100000)
                return "quit";
            else
                return "noQuit";

        }
    }
用StringBuilder垃圾回收次数多的吓人,内存占用离谱,由于aaa没有+=根本不会因为StrReceiveFromNet运算次数多而增加内存,一百万次也没有一次垃圾回收。看来什么东西不能想当然
  • 打赏
  • 举报
回复
你这个代码要是使用StringBuilder反而是非常荒唐的事情了,反而是多做了很多工作。正如上面很多人已经指出的,又没有连接复制字符串,谈不上什么StringBuilder啊?!
艾伦图灵 2013-04-21
  • 打赏
  • 举报
回复
根本不会。 aaa = StrReceiveFromNet(); 因为这句仅仅是将aaa变量引用的内存地址中保存的数据修改为后面表达式的运算结果。 不会申请新的内存地址。
threenewbee 2013-04-21
  • 打赏
  • 举报
回复
while ((aaa = StrReceiveFromNet()) != "quit") { ... }
我要坚强 2013-04-21
  • 打赏
  • 举报
回复
我感觉还是StringBuilder好while里太多的垃圾对象触发太多次数的垃圾回收事件,浪费资源。每次aaa赋值产生一个垃圾类
_小黑_ 2013-04-19
  • 打赏
  • 举报
回复
string aaa = string.empty
shawn_yang 2013-04-19
  • 打赏
  • 举报
回复
static string aaa="" 不就不怕内存会多用了
MR00009 2013-04-19
  • 打赏
  • 举报
回复
是=而不是+=,只是StrReceiveFromNet里要处理好,不然循环这个有可能会增加占用。
hhping821 2013-04-19
  • 打赏
  • 举报
回复
没有做字符串连接,只是赋值,应该不会随着while循环次数的增多而内存增大。
shanyang1 2013-04-19
  • 打赏
  • 举报
回复
因为看到文章说string每次赋值都是在内存新开空间进行,以前的string值并没有消失,随着string=xxx的次数增多,而以前的string值在内存每小时岂不是越来越多
wxl1010 2013-04-19
  • 打赏
  • 举报
回复
同上,最多string aaa = "";改成string aaa = null;
  • 打赏
  • 举报
回复
if(aaa.Equals("quit")) ... 你这个也不涉及内存啊,为什么会增大?就算增大也是因为StrReceiveFromNet()里面没处理好吧

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧