学习 C# 不仅会让你对使用 C/C++ 毫无准备,你学习的习惯可能会阻碍你成为一名优秀的 C/C++ 程序员。
C# 和 C/C++ 之间的根本区别在于托管语言和非托管语言之间的区别。在 C# 中,当您创建一个对象时,该语言会对其进行跟踪。只要对象被引用,它就会一直保留在内存中。一旦对对象的所有引用都消失了,并且不能再访问该对象,它所占用的内存就会被释放以供其他用途。运行时环境还会不时整合释放的内存(垃圾收集),以确保可用内存是连续的并准备好重用。
这些都不存在于 C/C++ 中。 (有一个 C++ 的托管版本,但它确实是一种完全不同的语言,在其哲学上更接近 C# 而不是 C++。)在 C/C++ 中,您显式分配对象或原始内存。当不再使用时,由您来释放分配的空间。当您分配内存时,没有什么可以阻止您访问分配的段之外的字节,从而导致各种错误(或更可能是崩溃)。与内存管理相关的细微编程错误很容易被其他人利用,从而造成严重的安全漏洞。
你可能想知道为什么这样的语言会存在?这就是重点:在 C/C++ 中,您拥有控制权。没有自动垃圾收集中断程序执行并导致不可预测的延迟。通过指针直接访问内存没有开销,因此非常高效。内存区域甚至可以通过正确的驱动程序直接映射到硬件。
如果您在 C# 中工作,您将不会学到这些。事实上,通过指针访问数据的想法可能对您来说仍然陌生。
现在我并不是说一个好的 C# 程序员不能成为一个优秀的 C/C++ 程序员。但是学习过程必然需要改掉您作为 C# 程序员可能养成的许多习惯。
需要说明的是,我经常使用 C 和 C++。我喜欢使用这些语言。我也喜欢 C# 和它提供的便利。对于如今的许多项目,C# 将是我的首选,而不是 C++。但从这次经历中,我可以告诉你,当我用 C# 编写代码与用 C 或 C++ 编写代码时,我的想法非常不同。例如,当我编写 C++ 代码时,我永远不会在没有相应删除的情况下写下 new,当我使用它们时,我确信执行不能跳过该删除(而且不会尝试多次执行。 ) 而且我学会了几乎从不使用的艰难方法,例如,strcpy,即使使用 strncpy 并确保始终存在终止零也是众所周知的痛苦。 (是的,在 C++ 中有更优雅的方法来处理上述所有问题,但这些方法有其自身的缺陷,无论如何,它们并不是很方便。)我显然不必为这样的事情而烦恼在 C# 中工作时。
领取专属 10元无门槛券
私享最新 技术干货