因为C#号称是JAVA它表弟,抛弃了许多C++的缺点,甚至连内存管理都……
于是大家都不用管内存了,反正有GC嘛!看看我这个帖子的回复情况就知道有那么多人学得那么地肤浅。一看分数来了就挣着抢,可是为什么一到说到事情的根本,C#的内存管理,就无人回复了呢?

解决方案 »

  1.   

    就是这个帖子
    http://topic.csdn.net/u/20081001/17/ad28659e-1f0b-4d8b-8881-d5063dac3e4e.html
      

  2.   

    貌似C#面试题就有 值类型和引用类型的区别 ~~
    C++的动态分配内存都要delete 不然就会内存泄露,C#不用管~
      

  3.   

    楼主自己比较一下 ildasm 后的 IL 代码:
    class Demo
    {
      void func1()
      {
        byte[] cmd = new byte[] {0x11, 0x03};
      }
      
      void func2()
      { 
        byte[] cmd = {0x11, 0x03};
      }
      
      static void Main()
      {
      }
    }/*
    .method private hidebysig instance void  func1() cil managed
    {
      // 代码大小       20 (0x14)
      .maxstack  3
      .locals init (uint8[] V_0,
               uint8[] V_1)
      IL_0000:  nop
      IL_0001:  ldc.i4.2
      IL_0002:  newarr     [mscorlib]System.Byte
      IL_0007:  stloc.1
      IL_0008:  ldloc.1
      IL_0009:  ldc.i4.0
      IL_000a:  ldc.i4.s   17
      IL_000c:  stelem.i1
      IL_000d:  ldloc.1
      IL_000e:  ldc.i4.1
      IL_000f:  ldc.i4.3
      IL_0010:  stelem.i1
      IL_0011:  ldloc.1
      IL_0012:  stloc.0
      IL_0013:  ret
    } // end of method Demo::func1.method private hidebysig instance void  func2() cil managed
    {
      // 代码大小       20 (0x14)
      .maxstack  3
      .locals init (uint8[] V_0,
               uint8[] V_1)
      IL_0000:  nop
      IL_0001:  ldc.i4.2
      IL_0002:  newarr     [mscorlib]System.Byte
      IL_0007:  stloc.1
      IL_0008:  ldloc.1
      IL_0009:  ldc.i4.0
      IL_000a:  ldc.i4.s   17
      IL_000c:  stelem.i1
      IL_000d:  ldloc.1
      IL_000e:  ldc.i4.1
      IL_000f:  ldc.i4.3
      IL_0010:  stelem.i1
      IL_0011:  ldloc.1
      IL_0012:  stloc.0
      IL_0013:  ret
    } // end of method Demo::func2
    */
      

  4.   

    LZ如果对底层的东东有兴趣,推荐两本书:
    《.NET本质论》和《框架设计(第2版):CLR Via C#》
      

  5.   

    其实lz认为两者是有区别的,但他觉得大多数人会认为两者没有区别,所以当看到大家果然如他想象中那样回答问题,就想大肆嘲笑一番。但实际情况就是:lz自己证明了自己的无知
    我认为不管是什么语言的高手,都不会以对内存分布情况的了解多少来自豪的,了解这些只是为了更好的去完成工作。
      

  6.   

    关于内存管理,其他语言如delphi的object pascal、c/c++、c#里的所谓非托管代码无非就是告诉你自己申请(new/alloc)的资源要自己free掉
    但是难道造车子非要自己造轮子不可?完全可以让别人去生产然后组装,而c#告诉你不用管理,就是为了不让你拘泥于技术细节不可自拔,永远做些低层次的工作,让你有更多的时间去思考系统的整体设计、性能优化/瓶颈、业务逻辑、扩展性、可维护性、团队协作问题等,c#和java的就是希望你成为一个系统分析师过好日子,而不是做个简单的程序员,永远做些别人已经实现而不公开的重复工作和代码编写,当然你如果是做系统级的软件的另当别论,所以做一个大的系统工作量一点没少
      

  7.   

    楼主喜欢更底层的东西.仍然可以使用C++.没必要用C#Herbert Schildt 写的<<The Art Of C++>>不错.
      

  8.   

    于是大家都不用管内存了,反正有GC嘛! LZ还是多看看书吧!
      

  9.   

    LZ学院派,我还是比较同意实战派。只要做出来的东西稳定,易用,谁会再去关心你是用的array还是list.
      

  10.   

    语言都是工具,何必那么较真呢?真相学习的话,还是自己做 OS 和 Dev 吧
      

  11.   

    顶三楼
    要看有什么区别IL代码是最明显的。
    《CLR VIA C#》我有,是本不可多得的好书,楼主可以看看
      

  12.   


    有gc干嘛不用,那你还用什么c#~
      

  13.   

    低级的程序员,当然要用GC,而且只用GC。
    高手也要用GC,但是他有更多的手段使自己的程序得到最大程度的优化。
    程序员的追求是不同的。
      

  14.   

    Production Debugging for .NET Framework Applications - Chapter 2Inside Microsoft .NET IL Assembler
      

  15.   

    编译器自动第二个函数的cmd加上一个new 
      

  16.   

    首先我承认当时发这个帖子里心里着急,有点偏激。所以楼下的跟着偏激就不足为怪了。
    然后说明情况,我以前用C++,看到帖子中的那种定义数组的方法自然会产生疑问。于是查msdn->.net中关于new的说明,但它告诉我new就是在堆中申请一块内存,而且没有在旁边注明编译器会自动为byte[] cmd = {0x11, 0x03}之类的写法自动添加new操作符。
    我之所以用这个题目,是有些故意的:因为前面连续6个回复都在说一样,一样,一样!但到底为什么一样咋不说?我不需要这种肤浅的、重复的“一样,一样,就是一样”,我需要的是为什么,虽然答案也很简单。
      

  17.   

    谢谢你们!!
    syeerzy,shalen520,walkingmu,hyblusea,wartim,wuyi8808
      

  18.   

    C#其实像vb,能省的都省了,能编译器做的都编译器做了,能内部隐含文件处理都内部隐含文件处理了,所以有的时候看代码会觉得逻辑不通的,好事还是坏事呢?不知道了
      

  19.   

    哎,楼主对c#,确凿的说是对netframework的机制不了解,所以在这里说些无知的话,反倒让人取笑了。
    netframework推出来的一个很重要的目的就是为了提高开发效率,像c#3.0,4.0里很多新颖的特性,能让开发变得非常快捷,但你用c#2.0的语法也能写出来,但要多很多代码做很多其他处理,他们最终编译后的结果却是一样的。
    真的是用自己的无知来嘲笑别人,呵呵。
      

  20.   

    我学C#混饭吃。。混不下去了就改行。
    我顶C#。。曾经顶过JAVA。。
      

  21.   

    讲究金钱效率的用C#, 追求免费的用java, 干坏事的用C++ , 想成牛人的用汇编 ,想被叫天才的用机器码
      

  22.   


    这个
    我个人从实际的方面出发……而且从某种角度出发……
    微软大哥的GC并没有比说的那么好用……如果一个EXE你不理会内存……他可以直奔XX MB.。。这个是相当可怕的……如果加点UI处理……就XXXMB
    我一般写程序的时候还是手动调用回收……很少等他自己回收
    也许是C++的时候留下的习惯……
      

  23.   

    因为微软会骗人呀,说什么C#是更好的C++,还说什么C#与C++一样的行动力,
      

  24.   

    请不要在这里比较语言的优劣,所谓存在必合理,各有优缺点。各人根据自己的实际各取所需就是了。
    我也是被迫用C#,因为方向是别人定的,我只做总体框架。其实有很多时候,尤其是工作的时候,想用哪个编程语言不是你自己说了算的。令我当时一时冲动发这个挑衅性的帖子是因为下面两个原因:
    一、有人告诉我说C#很简单,很VB6似的,拖拖拽拽就行。还好,没有相信。
    二、连续6个回复都只说一样,就是不提为什么。所以,上面这是我初学C#时遇到的7个人,我遇到了7个,7个都只提表面现象,所以我就说:有太多太多的人对这门语言看得学得很肤浅,这种广泛的批评有错吗?虽然我的C#水平很是一般,但照楼上前几位说的,我还真的就是想取笑、嘲笑上面提到的那些看问题肤浅的人!相比他们,我还是有点自豪滴——起码我还在穷根究底,起码我没有人云亦云:一样、一样、一样!!
      

  25.   

    大家只说一样一样不告诉你为什么一样,就凭你发帖子的言论和态度,你觉得他们有必要告诉你为什么是一样的吗?
    用自己的无知取笑别人的无知,用自己的错误再去批评别人. 这世界真TMD疯狂.!!!
      

  26.   

    我最近看了本书
    c#集成了C的高效,c++的面向对象结构,vb的快速开发,java的安全
    最近我也一直在考虑这些"集成"看到回帖受益很深,
    呵呵
    谢谢楼主~~~
      

  27.   


    你可以说GC效率低,也可以说GC的执行效率低,但千万不要说开发效率低,因为GC就是为了提高开发效率,减少内存溢出,减轻程序员负担的。如果研究过.NET的GC的话,会发现GC的效率是非常高的,或许比你自己回收的效率更高(因为.NET的GC是经过回收效率优化过的)。
    另外,据说.NET 4.0的GC更快。
      

  28.   


    LZ只是带着C++的旧眼光去看C#罢了
      

  29.   

    C刚刚出来的时候,汇编的程序员们开始怀疑,打击C
    认为C在资源回收方面只有一句话就完成了,没有像汇编一样自己一个个的去清除cpu资源,内存资源等等,觉得不安心。
    过不了多久这些人都用c了,也就没人去争吵这个问题了。
      

  30.   


    《框架设计(第2版):CLR Via C#》已经读完,觉得像内存管理的东西,了解一下就成,没必要深入研究,要不然还要GC干什么,还要自动内存管理干什么!有这些精力多多的研究下业务!