毋庸置疑,所有的程序员都不会不同意这样的观点:编写程序是一种逻辑非常严谨的工作。我作为一名老C/C++程序员,早就已经养成了分配和释放内存一定要成对出现的习惯,比如:void demo_func (void){    new  xxxxClass;    xxxVar = malloc(size);     .....    free(xxxVar); delete xxxxClass ;}近期在阅读一名C#程序员编写的C代码时,简直可用惨不忍睹来形容,一段程序中需要使用一个变量,每次使用,都用Create创建对象的方法,但是根本没有释放,美其名曰说:习惯了,C#有垃圾回收器帮你做事。如果垃圾回收器被这样来使用的话,那么真是无语了。我想,C#和JAVA的垃圾回收器设计的理念应该不是为了让程序员这样来使用吧,而是为了使得内存的使用更有效率,为了弥补程序员在编写程序时没有显式释放内存的缺陷而设计的吧,但并不代表你就不需要显式地释放内存。很多JAVA程序员编写的程序运行一段时间后就会越来越慢,是否就是这个原因呢,不得而知。在此,我作为一名C/C++程序员,给所有的C#和JAVA程序员一个忠告,那就是尽可能不要依赖垃圾回收器来为你工作,而要相信自己,养成良好的逻辑思维习惯和编程习惯,这样,你的代码才能做到稳定、可靠、高效地运行,你自己的逻辑思维能力和逻辑判断能力也才能不断地提高。否则,你不可能成长为一名合格的,逻辑严密的,真正的程序员。从另一个角度来看,C#和JAVA的垃圾回收器真的不是一个好东西,它的存在,破坏了程序的严谨性,有可能毁掉了没有学习过C语言的年轻一代的C#和JAVA程序员。当然,程序语言本身没有错误,如何使用关键还看程序员自己,年轻的一代程序员,垃圾回收器,还是忘记这个工具的存在吧,你会变得越来越严谨。

解决方案 »

  1.   


                //C#上的
                TestClass tc = new TestClass();//创建新实例
                不依靠GC,怎么把它释放掉?
      

  2.   

    C#本来就是用GC来释放内存的,手动无法释放(IDispose除外),这种习惯其实无所谓不好。GC的这个功能让代码变得更简洁(其实GC做的,比很多C++程序员自己做的都要好)。
      

  3.   

    其实GC做的,比很多C++程序员自己做的都要好
      

  4.   

    从另一个角度来看,C#和JAVA的垃圾回收器真的不是一个好东西,它的存在,破坏了程序的严谨性,有可能毁掉了没有学习过C语言的年轻一代的C#和JAVA程序员。好像我。
      

  5.   

    既然你是一个c/c++程序员,就不要来指点C#程序员了。
      

  6.   

    手动释放有用吗?
    还是要GC来判断,GC就是干这个的
      

  7.   

    c#压根没有释放内存的delete语法,手工释放个什么?有的类有close方法,是实现了IDispose,这种类是因为用了非托管的资源,用完了倒是可以手工close,不过这个功能也不是释放内存,而是释放资源。而且用usring加{},不用写close,也是成对的,很优雅。
      

  8.   

    了解语言环境了解语言基础上去养成良好的编程习惯。不能说一定要把C/C++的习惯生搬硬套的弄到C#里来。
    也不能说C#的编码习惯应该带到C/C++里去。
      

  9.   

    PS: 如果有人在C#项目里,给所有的class都加上 ~XXX() 我也会疯掉的。
      

  10.   

    用C++的朋友对C#的忠告很诚肯, C#活了10多年了为什么做不了象样的桌面程序(象Office,Photoshop级别的)就是因为:C#和JAVA的垃圾回收器真的不是一个好东西,它的存在,破坏了程序的严谨性,有可能毁掉了没有学习过C语言的年轻一代的C#和JAVA程序员。
    这是新时期外国人给中国人的牙片,让你舒服,让你无知,让你思维退化。(微软的粉丝会骂我了。。没有关系,中国的大多数程序员素质本来就低)
    看看国外的大牛多么的谦虚,多么的热心。而在中国,别人的热心会带来攻击!!!
      

  11.   

    我对LZ的建议也很诚恳,GC是.Net的优势,多线程程序里,C++的野指针问题,想解决好是很麻烦的,相信就算是有几年经验的程序员,也经常会被这个问题困扰,而这在.Net里面几乎不是问题。btw,LZ本可以说说其他方面的。
      

  12.   

    但是,C++不也说要尽量用物体来管理资源么。auto_ptr, refcount什么的
      

  13.   


    11 楼是老鸟,一针见血的从技术进行反驳。楼主的问题源于“阅读一名C#程序员编写的C代码”,如果楼主读到的是C程序员写的C#代码,会有什么感想?
      

  14.   

    我也是用了c++和delphi好多年了,申请->释放、构造->析构这些概念在脑子里扎根太深了,有一段时间搞了搞c#,实在是很别扭,而且我们的项目没有用c++或delphi完成不了的,所以就没下文了。
    说句题外话,申请和构造对我们是有意义的,因为要使用对象要使用指针,而释放和析构其实对我们编写程序没有意义,一个东西对我来说没有用了,常理来说我是不会在意该何时何地或该由谁来扔掉它。
    一个真正的程序员,即使是用c#,他也会意识到虽然一个对象即使不是我亲自扔掉的,但肯定有人会帮我扔掉,它没用了是应该被扔掉的。不能否认c#确实隐藏了太多东西,也造就了一大批概念混乱的所谓程序员,但这不是c#的错,也不是托管代码的错,还是在人。
      

  15.   

    这样的争辩无有意义,两种语言对市场的定位本来就不同。
    我们不能因为有汇编,就不用c++了吧。
    想起了linux之父的那场争辩,呵呵。作为一个c++程序员,谨慎的支持一下c#。
      

  16.   

    c#总共才有十年。好象时间还是挺短的。现在的c#已经不错了。再过10年来看c#,10年后的c#一定可以开发驱动。
      

  17.   

    一个大的C#项目,不是楼主说看到的那样,一个对象自存在一个方法中。可能是多个方法调用,或者是重复利用的。在C#中更看重的是生命周期。《Csdn收音机》是个开源的辅助工具,以后学技术更方便了!
      

  18.   

    欢迎lz到java跟.net平台里找出路来了,尽管仍然不忘c++语法,但是迟早会改变的。
      

  19.   

    实际上我还是要强调一次,我们招聘c开发员就是要求使用c来开发设备驱动和加密等少量模块,而c++程序员很多都太虚了,所以通常都考察其是否可以真正开发稳定的设备驱动程序,而其实并不考虑其使用的语言。
      

  20.   

    部分赞同楼主的观点,有这个意识是有必要的。事实上我们这里也发生过由于没有手动释放资源而导致把IIS的Application Pool搞趴下的事情。但是必须承认,C#与C++定位不同,C#更适合做快速开发项目。往好了说就是降低了技术门槛,节省各方面的成本,程序员也可以更关注业务逻辑而不是琐碎的细节;往坏处说就是对程序员的要求可以不高,细节全权由系统负责,一旦这方面有瑕疵就容易导致意想不到的错误。所以这是个权衡,不同的需求会有不同的侧重面。
      

  21.   

    也许楼主看到的那个程序员写的代码实在是烂,影响了lz的心情
       (lz以为做c++的很牛逼,看不起做c#和做java的)也不知道lz写没写过c#代码?
      

  22.   


    photoshop和paint.net差别很大吗?至少我不觉得有多大区别
      

  23.   

    在什么山唱什么歌,都以一个尺子度量所有的东西,兰州觉得有意思么?
    C++的机制跟C#不一样,不要一概而论,垃圾回收是它的特点,你教我释放一下?
    只能说你让一个不了解C++的人在你熟悉的领域工作,你看得不爽而已
    仅此而已
    你要用C#写点东西试试?
    记住,C++永远也不可能在开发速度上超过托管机制的Java和C#,现在的硬件资源过剩,快速的开发出适应需求的东西才是重要的,C++和C#携手发挥自己的优势去开发才是王道。
    本人做过3年C++,项目经理,现在多数采用C#以及Java进行敏捷开发,欢迎切磋。
      

  24.   

    .NETC#里面除非你使用了不安全代码(也就是用了指针之类的东西),否则除了非托管资源外都不需要也不能手动马上释放,.NET/C#里面即使你手动释放了,GC一样不一定立即执行,而是等到GC认为需要的时候才会释放。
    如果能手动立即释放某个类的内存,在.NET/C#里面反而会出大问题,比如某个方法里面的代码如下
    A a=new A();
    ....
    Func<int> f = () => a.GetInt();
    return f;
    如果有人在这个方法里面把 a 给释放了肯定就会悲剧。
      

  25.   

    C#中尽量不要手动执行GC的动作,其实GC是一个比较消耗的事情。
      

  26.   

    无论这个提醒是对是错,很感谢楼主对C#开发人员的提醒。
    养成良好习惯是必须的,这个提醒可能并没有深入对c#的了解,出发点是好的。
    C/C++确实也有一些好的地方,欢迎楼主继续把好的与我们分享!
      

  27.   


    LS许多人至少有一点没有搞清楚,这位LZ是提醒c#程序员今后编写c程序时如何如何。编写c程序当然要懂c,就好象编写c#程序也要首先懂.net。然而,LZ话锋一转,变成批评java跟.net了,那么这个文章的逻辑就前后不搭调了。
      

  28.   

    其实,任何东西都要实事求是,你编写的是c#程序而不是c程序,就好象你编写的是c程序不是c#程序一样,这是很自然的事。还是欢迎lz加入.net开发者的行列吧。别的都是过眼烟云。
      

  29.   

    贴图片很累吧,用《Csdn收音机》截图功能轻松解决!
      

  30.   

    C#程序员写的C有些烂,只能说明该程序员的C功夫没到家,而不代表C#如何如何
    我在C#中基本上不用管内存的事,只管考虑自己的业务逻辑就行了,在C/C++中对内存的申请和释放注意下就行了,也没那么恐怖,很多人把C/C++的指针/手动内存管理说的多么可怕,其实不然,都是自己吓自己,说到底是C/C++没学好而已
      

  31.   

    用C#如果过于关注内存的释放反而会产生一些问题。只要内存的压力不是很大, 托管堆上的就让.NET处理好了
      

  32.   

    没办法沟通的,谁告诉你们Java有垃圾收集器但不能显示的释放呢?
    Java都是被这样的程序员埋汰了,你们并没有领会楼主大哥的文章... ...
      

  33.   

    一名C#程序员对C,C++,JAVA程序员的忠告:
    你玩你的,只要你自我感觉良好.
    如果能用C#完成的工作,建议还是转过来玩C#吧。
      

  34.   

    尊听前辈提醒确实是这个样子的,其实如果没有学习C或者C++,直接学习C#的 最开始谁都不会想到.net内部已经实现垃圾回收的,这些底层的东西 ,很多都没来得及去学习,浮沙筑高台的人多了,早晚会出问题滴!
      

  35.   

    每种语言都有其优点和缺点,C++与C#并不一样;
    所以,个人认为也没有什么可以相比的东西,更没有可以套用的东西;
    如果有开发IDE的微软早就说明了;再说,C#本身就是为了加速开发周期的,如何还和C++一样,对代码处理的细致性,那么它就不能加速软件的开发周期了;它也可能不会如此受人青睐;;;\个人理解 ,,,
      

  36.   

    有些人就是见不得别人比他方便,C++确实好,也确实比C#麻烦谁说我们C#不释放啊?我们有GC我们可以using(new class){}这样用,不用考虑那么多我们开发速度就是快,我们就是不用考虑那些不应该考虑的事情嘲笑楼主
      

  37.   

    顶3楼,我最讨厌拿效率说事的 c/c++程序员了。虽然不得不承认C/C++效率高,但是不要用你的一点点小聪明和数以万计的智慧结晶对比……根本就没有可比性!