之前很多人都说 Python 用起来简单,我的第一感觉就是胡扯,现在我稍微学了一点,更加坚信了那是胡扯。
当然 Python 在很小很小的项目里面可能是简单,例如 Python 写一个 HelloWorld,其只要一句 print "HelloWorld"就行了,而在 C# 里面,由于语法限制,其需要一个命名空间、一个类、一个 Main 函数和一句 Console.WriteLine("HelloWorld");才能完成一个控制台输出 HelloWorld 的程序,但是倘若我们去完成一个稍微大一点的项目,那就不一定了。
例如我们要完成读取 Excel 中一张名为 XXX 表中的数据,在双方都不使用第三方框架的情况下,同时 C# 不使用 ADO.NET 技术,那么双方实现读取 Excel 的困难程度应该是差不多的,但是如果允许使用第三方类库(备注:1、使用免费的第三方类库,因为 C# 有个收费类库读取 Excel 只需要一两行代码就能完成;2、C# 不使用 ADO.NET 技术),那双方的代码量应该是差不多的。
因此说 Python 用起来简单,那是无稽之谈,真正使开发变得简单的是第三方类库,而对于 Python、C#(除了.Net Core 外)来说,其第三方类库都是充足的,因此其开发应该都是差不多的。
1、程序的运行生命周期可以分为编译时、链接时、加载时、运行时,这 4 个阶段。在 Python 中,这 4 个阶段是一体的,而在 C# 中却是严格分离的,在 C# 要想跨阶段执行则就需要用到反射。这就造成了两者之间具有很大的不同。备注:不讨论 C# 中 dynamic 这样的动态类型。
例如依赖注入,在静态语言中依赖注入的价值体现在其通过 IoC 把对象对接口及实现的依赖反转为对 DI 容器的依赖,通过在 DI 容器中注入,从而获得对象的实现,即其将对象的索取从编译时、加载时转移到了运行时。而对于像 Python 这样的动态语言,由于其各个阶段是一体的,从而使得其本身的运行环境就好比是一个 DI 容器。
2、由于 1 的原因,Python 可以实现类型之间的快速切换,而 C# 却需要通过相应的类型转换才能实现。备注:无视 C# 隐式类型转换
例如 int 和 long 之间的切换
num=2147483647
num=num+1
Python:2147483647 是 int 的上限值,当其 +1 后,这个 num 变量会自动转变为 long 类型
int num=2147483647;
num=num+1;
而如果 C# 写成这样,其程序在运行到 num=num+1;时,便会出错
int num=2147483647;
long numLong=(long)num+1;
我们只有先将 num 转化为 long 类型,然后 +1,并赋值给新的对象,这样我们才能获得正确的值 2147483648。
3、同样由于 1 的原因,Python 无法做静态类型检查,而 C# 却会进行静态类型检查。
这使得 C# 在编译时就能发现相应的类型错误,而 Python 却只能在程序运行时才能发现。
对于 Python 的这一点,其就好像是一把双刃剑,虽然这免去了类型约束,便于写代码,但是这也使得代码变得更难维护。这也是 “动态类型一时爽,代码重构火葬场” 的由来。
4、Python 没有访问修饰符,而 C# 有 public、private、internal、protected、protected internal 等的访问修饰符。
访问修饰符可以起到对相关内容访问的控制作用。但是 Python 却没有,有人说__是私有什么的,那其实是伪私有,换个写法就又能进行访问了,因此 Python 中相关内容的访问全靠编程者的自觉,同时编程者也必需知道哪些内容可以访问,哪些内容不可访问。
5、Python 没有 interface,其只能类继承,同时其还支持多继承,而 C# 只能单继承,一个类只能继承一个类,当然 C# 为了弥补单继承的不足,还带来了 interface,一个类可以继承多个 interface。
有关 Python 的抽象类多继承和 C# 的 interface 多继承,这 2 者之间的区别就不多说了,区别还是比较大的。
Python 的多继承会增加代码的复杂度,再加上 Python 没有访问修饰符,这也就变相要求了编程者的能力,尤其是当项目越来越大,需求越来越多,业务越来越复杂的时候。
6、Python 没有泛型,或者说不需要泛型,而 C# 却有泛型。
对于这一点没什么好说的,Python 不需要泛型的理由就是之前提到的 1、2 这两点,即由于其所有变量签名都是动态的,因此对于 Python 来说,其不需要泛型。
总结:
1、Python 是一门非常灵活的动态语言及动态类型语言。Python 为了其灵活性,抛弃了很多东西,因此我认为这灵活性就相当于一把双刃剑,真正要想掌控好这门语言还是挺难的。
2、除了上面说的不同点外,其实 Python 和 C# 之间还有很多其他的不同点,具体的不说了,在这儿我想说的是他们两者的编程思维也因此发生很大的不同。所以如果你目前只会动态语言,那就去学一门静态语言看看吧;如果你目前只会静态语言,那就去学一门动态语言看看吧,只有动静结合方能大成/滑稽