当前位置:编程学习 > C#/ASP.NET >>

一名C/C++程序员对C#和JAVA程序员的忠告

毋庸置疑,所有的程序员都不会不同意这样的观点:编写程序是一种逻辑非常严谨的工作。

我作为一名老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程序员。

当然,程序语言本身没有错误,如何使用关键还看程序员自己,年轻的一代程序员,垃圾回收器,还是忘记这个工具的存在吧,你会变得越来越严谨。


--------------------编程问答-------------------- 嗯……初学C#,谢谢前辈提醒! --------------------编程问答--------------------
            //C#上的
            TestClass tc = new TestClass();//创建新实例
            不依靠GC,怎么把它释放掉? --------------------编程问答-------------------- C#本来就是用GC来释放内存的,手动无法释放(IDispose除外),这种习惯其实无所谓不好。GC的这个功能让代码变得更简洁(其实GC做的,比很多C++程序员自己做的都要好)。 --------------------编程问答-------------------- 其实GC做的,比很多C++程序员自己做的都要好 --------------------编程问答-------------------- 从另一个角度来看,C#和JAVA的垃圾回收器真的不是一个好东西,它的存在,破坏了程序的严谨性,有可能毁掉了没有学习过C语言的年轻一代的C#和JAVA程序员。

好像我。。。。 --------------------编程问答-------------------- 手动进行内存管理就能有程序的严谨性? --------------------编程问答-------------------- 既然你是一个c/c++程序员,就不要来指点C#程序员了。 --------------------编程问答-------------------- 手动释放有用吗?
还是要GC来判断,GC就是干这个的 --------------------编程问答-------------------- 不能养成坏习惯呐,谢谢!学习了 --------------------编程问答-------------------- c#  垃圾回收器机制,释放在对象作用域结束之前的某个合适的时机来回收它, 这是对我们没有显示释放资源来说,是很重要的,但是我们并不是一切都要靠垃圾回收器来帮我们处理我们本来可以自己处理,而会使程效能显著提升的事,所有他说的很重要 --------------------编程问答-------------------- c#压根没有释放内存的delete语法,手工释放个什么?

有的类有close方法,是实现了IDispose,这种类是因为用了非托管的资源,用完了倒是可以手工close,不过这个功能也不是释放内存,而是释放资源。而且用usring加{},不用写close,也是成对的,很优雅。 --------------------编程问答-------------------- 了解语言环境了解语言基础上去养成良好的编程习惯。

不能说一定要把C/C++的习惯生搬硬套的弄到C#里来。
也不能说C#的编码习惯应该带到C/C++里去。 --------------------编程问答-------------------- PS: 如果有人在C#项目里,给所有的class都加上 ~XXX() 我也会疯掉的。 --------------------编程问答-------------------- 用C++的朋友对C#的忠告很诚肯, C#活了10多年了为什么做不了象样的桌面程序(象Office,Photoshop级别的)就是因为:C#和JAVA的垃圾回收器真的不是一个好东西,它的存在,破坏了程序的严谨性,有可能毁掉了没有学习过C语言的年轻一代的C#和JAVA程序员。
这是新时期外国人给中国人的牙片,让你舒服,让你无知,让你思维退化。。。。(微软的粉丝会骂我了。。没有关系,中国的大多数程序员素质本来就低)
看看国外的大牛多么的谦虚,多么的热心。。。。而在中国,别人的热心会带来攻击!!!

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

btw,LZ本可以说说其他方面的。

引用 14 楼 xonln 的回复:
用C++的朋友对C#的忠告很诚肯, C#活了10多年了为什么做不了象样的桌面程序(象Office,Photoshop级别的)就是因为:C#和JAVA的垃圾回收器真的不是一个好东西,它的存在,破坏了程序的严谨性,有可能毁掉了没有学习过C语言的年轻一代的C#和JAVA程序员。
这是新时期外国人给中国人的牙片,让你舒服,让你无知,让你思维退化。。。。(微软的粉丝会骂我了。。没有关系,中国的大多数程序……
--------------------编程问答-------------------- 但是,C++不也说要尽量用物体来管理资源么。auto_ptr, refcount什么的 --------------------编程问答--------------------
引用 14 楼 xonln 的回复:
用C++的朋友对C#的忠告很诚肯, C#活了10多年了为什么做不了象样的桌面程序(象Office,Photoshop级别的)就是因为:C#和JAVA的垃圾回收器真的不是一个好东西,它的存在,破坏了程序的严谨性,有可能毁掉了没有学习过C语言的年轻一代的C#和JAVA程序员。
这是新时期外国人给中国人的牙片,让你舒服,让你无知,让你思维退化。。。。(微软的粉丝会骂我了。。没有关系,中国的大多数程序……


你说的这些没有一句是有事实依据的,而且你不谈技术,只搞人身攻击,你的素质何在呢? --------------------编程问答-------------------- 看看积累东西 --------------------编程问答--------------------
引用 11 楼 hztltgg 的回复:
c#压根没有释放内存的delete语法,手工释放个什么?

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


11 楼是老鸟,一针见血的从技术进行反驳。

楼主的问题源于“阅读一名C#程序员编写的C代码”,如果楼主读到的是C程序员写的C#代码,会有什么感想? --------------------编程问答-------------------- C#没有自己申请的内存,不用显式释放 --------------------编程问答-------------------- 我也是用了c++和delphi好多年了,申请->释放、构造->析构这些概念在脑子里扎根太深了,有一段时间搞了搞c#,实在是很别扭,而且我们的项目没有用c++或delphi完成不了的,所以就没下文了。
说句题外话,申请和构造对我们是有意义的,因为要使用对象要使用指针,而释放和析构其实对我们编写程序没有意义,一个东西对我来说没有用了,常理来说我是不会在意该何时何地或该由谁来扔掉它。
一个真正的程序员,即使是用c#,他也会意识到虽然一个对象即使不是我亲自扔掉的,但肯定有人会帮我扔掉,它没用了是应该被扔掉的。不能否认c#确实隐藏了太多东西,也造就了一大批概念混乱的所谓程序员,但这不是c#的错,也不是托管代码的错,还是在人。 --------------------编程问答-------------------- 不论是那种语言的使用,都应该使用思维逻辑在先,主动预防,总是比被动防御来的高效 --------------------编程问答-------------------- 也许有时只是需要更快吧 --------------------编程问答-------------------- --------------------编程问答-------------------- gc 的优势是不是基于“一切(大多数)都被托管了”? --------------------编程问答-------------------- 这样的争辩无有意义,两种语言对市场的定位本来就不同。
我们不能因为有汇编,就不用c++了吧。
想起了linux之父的那场争辩,呵呵。

作为一个c++程序员,谨慎的支持一下c#。 --------------------编程问答--------------------
引用 14 楼 xonln 的回复:
用C++的朋友对C#的忠告很诚肯, C#活了10多年了为什么做不了象样的桌面程序(象Office,Photoshop级别的)就是因为:C#和JAVA的垃圾回收器真的不是一个好东西,它的存在,破坏了程序的严谨性,有可能毁掉了没有学习过C语言的年轻一代的C#和JAVA程序员。
这是新时期外国人给中国人的牙片,让你舒服,让你无知,让你思维退化。。。。(微软的粉丝会骂我了。。没有关系,中国的大多数程序员……

c#总共才有十年。好象时间还是挺短的。现在的c#已经不错了。再过10年来看c#,10年后的c#一定可以开发驱动。 --------------------编程问答-------------------- 一个大的C#项目,不是楼主说看到的那样,一个对象自存在一个方法中。

可能是多个方法调用,或者是重复利用的。

在C#中更看重的是生命周期。

《Csdn收音机》是个开源的辅助工具,以后学技术更方便了! --------------------编程问答--------------------
引用 28 楼 zanfeng 的回复:
引用 14 楼 xonln 的回复:
用C++的朋友对C#的忠告很诚肯, C#活了10多年了为什么做不了象样的桌面程序(象Office,Photoshop级别的)就是因为:C#和JAVA的垃圾回收器真的不是一个好东西,它的存在,破坏了程序的严谨性,有可能毁掉了没有学习过C语言的年轻一代的C#和JAVA程序员。
这是新时期外国人给中国人的牙片,让你舒服,让你无知,让你思维退化。。。。(微软的粉……


你确定 ? --------------------编程问答-------------------- 就象八年前我对c#的不屑一顾一样,现在感觉c#越来越强大。 --------------------编程问答-------------------- 欢迎lz到java跟.net平台里找出路来了,尽管仍然不忘c++语法,但是迟早会改变的。 --------------------编程问答-------------------- 实际上我还是要强调一次,我们招聘c开发员就是要求使用c来开发设备驱动和加密等少量模块,而c++程序员很多都太虚了,所以通常都考察其是否可以真正开发稳定的设备驱动程序,而其实并不考虑其使用的语言。 --------------------编程问答-------------------- 举个例子:
手工焊接电路的时候,用完电烙铁一定要记得拔下电源插头;
而波峰焊的时候,焊槽是由专人或者是电脑程控的,

使用任何一种生产手段,都有各自的标准,不要拿不相干的生产工具相提并论;

再举个例子:
过去我的一个同事是驾驶员,他学驾驶的时候,就要求能手工加工像汽缸垫这样的简单配件,维修更不在话下,30年前要是车坏在路上,可不就要自己能独立处理一些简单故障;
现在开车的人,甚至连换个火花塞都不会,坏在路上,会打电话就行了;再说了,很多先进的车辆都是程控的,你想修都修不了

无论是生产还是生活,降低对人的技能依赖是个总的趋势 --------------------编程问答-------------------- --------------------编程问答-------------------- 我们老师说,以前装一台电脑要用万能表的,哪个接口对面哪个都要量度的。现在那些接口各个不同,想乱插都插不入,而且颜色又不同,一个对面一个的。所以普通人也能装电脑。

LZ认为这样改进好还是坏呢? --------------------编程问答-------------------- 心中有数就好 --------------------编程问答-------------------- 部分赞同楼主的观点,有这个意识是有必要的。事实上我们这里也发生过由于没有手动释放资源而导致把IIS的Application Pool搞趴下的事情。

但是必须承认,C#与C++定位不同,C#更适合做快速开发项目。往好了说就是降低了技术门槛,节省各方面的成本,程序员也可以更关注业务逻辑而不是琐碎的细节;往坏处说就是对程序员的要求可以不高,细节全权由系统负责,一旦这方面有瑕疵就容易导致意想不到的错误。所以这是个权衡,不同的需求会有不同的侧重面。

--------------------编程问答-------------------- 有感于斯 --------------------编程问答-------------------- 根本就没有手工释放单一内存的方法,你怎么释放?
围观LZ.. ... --------------------编程问答-------------------- 新手千万不要被LZ误导. ... --------------------编程问答-------------------- 说这么多没有用,技术都是别人开发的,只有跟着别人跑.你不用也不行,中国就这样.只有跟着别人跑. --------------------编程问答-------------------- 也许楼主看到的那个程序员写的代码实在是烂,影响了lz的心情
   (lz以为做c++的很牛逼,看不起做c#和做java的)

也不知道lz写没写过c#代码? --------------------编程问答--------------------
引用 32 楼 sp1234 的回复:
欢迎lz到java跟.net平台里找出路来了,尽管仍然不忘c++语法,但是迟早会改变的。

+++ --------------------编程问答-------------------- 一开始我还以为是叫板贴~~~
O(∩_∩)O~ --------------------编程问答--------------------
引用 30 楼 sirzxj 的回复:
引用 28 楼 zanfeng 的回复:

引用 14 楼 xonln 的回复:
用C++的朋友对C#的忠告很诚肯, C#活了10多年了为什么做不了象样的桌面程序(象Office,Photoshop级别的)就是因为:C#和JAVA的垃圾回收器真的不是一个好东西,它的存在,破坏了程序的严谨性,有可能毁掉了没有学习过C语言的年轻一代的C#和JAVA程序员。
这是新时期外国人给中国人的牙片,让你……


photoshop和paint.net差别很大吗?至少我不觉得有多大区别 --------------------编程问答-------------------- 在什么山唱什么歌,都以一个尺子度量所有的东西,兰州觉得有意思么?
C++的机制跟C#不一样,不要一概而论,垃圾回收是它的特点,你教我释放一下?
只能说你让一个不了解C++的人在你熟悉的领域工作,你看得不爽而已
仅此而已
你要用C#写点东西试试?
记住,C++永远也不可能在开发速度上超过托管机制的Java和C#,现在的硬件资源过剩,快速的开发出适应需求的东西才是重要的,C++和C#携手发挥自己的优势去开发才是王道。
本人做过3年C++,项目经理,现在多数采用C#以及Java进行敏捷开发,欢迎切磋。 --------------------编程问答-------------------- .NETC#里面除非你使用了不安全代码(也就是用了指针之类的东西),否则除了非托管资源外都不需要也不能手动马上释放,.NET/C#里面即使你手动释放了,GC一样不一定立即执行,而是等到GC认为需要的时候才会释放。
如果能手动立即释放某个类的内存,在.NET/C#里面反而会出大问题,比如某个方法里面的代码如下
A a=new A();
....
Func<int> f = () => a.GetInt();
return f;
如果有人在这个方法里面把 a 给释放了肯定就会悲剧。 --------------------编程问答--------------------
引用 22 楼 bluekitty 的回复:
我也是用了c++和delphi好多年了,申请->释放、构造->析构这些概念在脑子里扎根太深了,有一段时间搞了搞c#,实在是很别扭,而且我们的项目没有用c++或delphi完成不了的,所以就没下文了。
说句题外话,申请和构造对我们是有意义的,因为要使用对象要使用指针,而释放和析构其实对我们编写程序没有意义,一个东西对我来说没有用了,常理来说我是不会在意该何时何地或该由谁来扔掉它。
一个真正的程……


还是在人 --------------------编程问答--------------------
引用 38 楼 ki1381 的回复:
部分赞同楼主的观点,有这个意识是有必要的。事实上我们这里也发生过由于没有手动释放资源而导致把IIS的Application Pool搞趴下的事情。

但是必须承认,C#与C++定位不同,C#更适合做快速开发项目。往好了说就是降低了技术门槛,节省各方面的成本,程序员也可以更关注业务逻辑而不是琐碎的细节;往坏处说就是对程序员的要求可以不高,细节全权由系统负责,一旦这方面有瑕疵就容易导致意想不到的……


支持!!! --------------------编程问答-------------------- 我们要多向别人学习,无论别人说的是对是错 --------------------编程问答--------------------
引用 51 楼 wanghao2979 的回复:
我们要多向别人学习,无论别人说的是对是错


错了怎么学习?诙谐? --------------------编程问答-------------------- C#中尽量不要手动执行GC的动作,其实GC是一个比较消耗的事情。 --------------------编程问答-------------------- 无论这个提醒是对是错,很感谢楼主对C#开发人员的提醒。
养成良好习惯是必须的,这个提醒可能并没有深入对c#的了解,出发点是好的。
C/C++确实也有一些好的地方,欢迎楼主继续把好的与我们分享! --------------------编程问答-------------------- 楼主对C++很熟,但对C#却只是了解。 --------------------编程问答--------------------
引用楼主 szwxj 的回复:
近期在阅读一名C#程序员编写的C代码时,简直可用惨不忍睹来形容,一段程序中需要使用一个变量,每次使用,都用Create创建对象的方法,但是根本没有释放,美其名曰说:习惯了,C#有垃圾回收器帮你做事。


LS许多人至少有一点没有搞清楚,这位LZ是提醒c#程序员今后编写c程序时如何如何。

编写c程序当然要懂c,就好象编写c#程序也要首先懂.net。然而,LZ话锋一转,变成批评java跟.net了,那么这个文章的逻辑就前后不搭调了。 --------------------编程问答-------------------- 其实,任何东西都要实事求是,你编写的是c#程序而不是c程序,就好象你编写的是c程序不是c#程序一样,这是很自然的事。

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

还是欢迎lz加入.net开发者的行列吧。别的都是过眼烟云。

呵呵~~ --------------------编程问答-------------------- 高手就是高手 --------------------编程问答-------------------- 多谢指教! --------------------编程问答--------------------

贴图片很累吧,用《Csdn收音机》截图功能轻松解决! --------------------编程问答-------------------- C#程序员写的C有些烂,只能说明该程序员的C功夫没到家,而不代表C#如何如何
我在C#中基本上不用管内存的事,只管考虑自己的业务逻辑就行了,在C/C++中对内存的申请和释放注意下就行了,也没那么恐怖,很多人把C/C++的指针/手动内存管理说的多么可怕,其实不然,都是自己吓自己,说到底是C/C++没学好而已 --------------------编程问答-------------------- 这个问题没得选择啊,垃圾回收不能干预的。 --------------------编程问答-------------------- 楼主 过激了

顺应时代发展的要求 --------------------编程问答--------------------
引用 34 楼 microtry 的回复:
举个例子:
手工焊接电路的时候,用完电烙铁一定要记得拔下电源插头;
而波峰焊的时候,焊槽是由专人或者是电脑程控的,

使用任何一种生产手段,都有各自的标准,不要拿不相干的生产工具相提并论;

再举个例子:
过去我的一个同事是驾驶员,他学驾驶的时候,就要求能手工加工像汽缸垫这样的简单配件,维修更不在话下,30年前要是车坏在路上,可不就要自己能独立处理一些简单故障;
现在开车的人,甚至……


牛头不对马嘴 --------------------编程问答-------------------- 用C#如果过于关注内存的释放反而会产生一些问题。

只要内存的压力不是很大, 托管堆上的就让.NET处理好了 --------------------编程问答-------------------- --------------------编程问答-------------------- 大哥,这能比吗?? --------------------编程问答-------------------- 没办法沟通的,谁告诉你们Java有垃圾收集器但不能显示的释放呢?
Java都是被这样的程序员埋汰了,你们并没有领会楼主大哥的文章... ... --------------------编程问答-------------------- 额。。。。大哥这样可以比吗? --------------------编程问答-------------------- 看了楼主对我帮助不大的忠告,但还是要谢谢 --------------------编程问答-------------------- 一名C#程序员对C,C++,JAVA程序员的忠告:
你玩你的,只要你自我感觉良好.
如果能用C#完成的工作,建议还是转过来玩C#吧。 --------------------编程问答-------------------- 各有各的优势啊,楼主不能一概而论的 --------------------编程问答-------------------- 初学c#,对c++了解些,谢谢分享经验 --------------------编程问答-------------------- --------------------编程问答-------------------- 好激烈! --------------------编程问答-------------------- --------------------编程问答-------------------- 来长长见识 --------------------编程问答-------------------- --------------------编程问答-------------------- 尊听前辈提醒。。。确实是这个样子的,其实如果没有学习C或者C++,直接学习C#的 最开始谁都不会想到.net内部已经实现垃圾回收的,这些底层的东西 ,很多都没来得及去学习,浮沙筑高台的人多了,早晚会出问题滴! --------------------编程问答-------------------- 每种语言都有其优点和缺点,C++与C#并不一样;
所以,个人认为也没有什么可以相比的东西,更没有可以套用的东西;
如果有开发IDE的微软早就说明了;

再说,C#本身就是为了加速开发周期的,如何还和C++一样,对代码处理的细致性,那么它就不能加速软件的开发周期了;它也可能不会如此受人青睐;;;\

个人理解 ,,, --------------------编程问答-------------------- --------------------编程问答-------------------- 有些人就是见不得别人比他方便,C++确实好,也确实比C#麻烦

谁说我们C#不释放啊?

我们有GC

我们可以using(new class){}这样用,不用考虑那么多

我们开发速度就是快,我们就是不用考虑那些不应该考虑的事情

嘲笑楼主 --------------------编程问答-------------------- --------------------编程问答-------------------- 我看这贴早点被GC吧 --------------------编程问答-------------------- 顶3楼,我最讨厌拿效率说事的 c/c++程序员了。虽然不得不承认C/C++效率高,但是不要用你的一点点小聪明和数以万计的智慧结晶对比……根本就没有可比性! --------------------编程问答-------------------- --------------------编程问答-------------------- 你们搞没搞清楚啊,就在这乱喷,人家说的是c#程序员写的c代码好不。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,