# IronPython和cPython的比较 ​

IronPython和标准Python（“ cPython”）之间存在一些细微差异和不兼容之处。有些是IronPython中的直接错误，应在以后的版本中将其删除。但是，其他被认为是“实现细节”，并且将保留。其中一些是非常具有挑战性的主题。

对于用户而言，最明显的区别是字符串的处理。原始cPython对于字节字符串和Unicode字符串具有两种不同的字符串类型。此概念类似于IEC中的STRING和WSTRING数据类型。IronPython仅使用始终支持Unicode的.NET字符串，并在内部使用UTF-16。但是，IronPython实现了一个技巧，可以向程序员隐藏与cPython的区别。（有趣的是，开发人员完全重新设计了新Python版本3的字符串处理。开发了一个与IronPython更加接近的模块。之后，仅使用Unicode字符串，并且存在用于处理原始字节的单独的数据类型。）

无法使用C语言编写的Python模块导入IronPython，因为cPython使用的内部数据结构与IronPython完全不同。大多数标准库模块已在IronPython中重新实现。但是，某些模块（例如TK接口）只要不明确地移植到IronPython中就不可用。另一方面，IronPython提供了对.NET程序集的访问，包括.NET框架（如上所示），它可以弥补此功能的不足。

尽管cPython使用引用计数和确定性垃圾收集器清除循环垃圾，但IronPython依赖于非确定性.NET垃圾收集器。在大多数情况下，这种差异并不重要。但是，当你从Python标准库或.NET框架打开文件或其他资源时，应确保稍后将其关闭。最好将with语句与Python上下文管理器或.NET IDisposable实例一起使用。