【C#vsPython·第一阶段】当 Console.WriteLine 遇上 print:程序结构的大不同
作为一个写了 15 年 C# 的程序员,我第一次写 Python 的时候,写了一个 Hello World,然后...就运行了。
没有 namespace,没有 class,没有 static void Main(),没有分号,没有大括号。就一行 print("Hello, World!"),然后 python hello.py,完事了。
当时我的内心是崩溃的——这代码...也能跑?我 15 年的仪式感呢?
后来我才明白,Python 的设计哲学是:代码是写给人看的,顺便给机器执行。而 C# 的设计哲学是:代码是写给编译器看的,人看得懂是bonus。
今天咱们就来对比两种语言的"第一印象":程序结构。C# 的"仪式感" vs Python 的"随性"。
Hello World 对比
先看看 C# 的传统写法:
using System;
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
}
再看看 Python:
print("Hello, World!")
没看错,就一行。
C# 9+ 引入了顶级语句,终于学乖了:
Console.WriteLine("Hello, World!");
对比一下:
| 对比项 | C#(传统) | C#(顶级语句) | Python |
|---|---|---|---|
| 代码行数 | 10+ | 1 | 1 |
| 需要命名空间 | 是 | 否 | 否 |
| 需要类 | 是 | 否 | 否 |
| 需要 Main 方法 | 是 | 否 | 否 |
| 需要分号 | 是 | 是 | 否 |
| 需要大括号 | 是 | 否 | 否 |
为什么 Python 不需要这些?
因为 Python 是解释型语言,不需要编译器提前知道所有类型信息。它从第一行开始逐行执行,不需要像 C# 那样先"搭建框架"。
这就像:C# 是先画好建筑图纸再施工,Python 是边设计边施工。
程序入口:谁说了算?
C# 必须有一个明确的入口点——传统方式是 static void Main(string[] args),顶级语句从文件第一行开始执行。
Python 从第一行开始执行,没有"入口点"的概念。不过有个可选的"入口保护":
def main():
print("Hello, World!")
if __name__ == "__main__":
main()
if __name__ == "__main__": 的意思是:只有这个文件被直接运行时才执行,被其他文件 import 时不执行。类似于 C# 的 Main 方法,但它是可选的。
为什么需要这个?
想象一下:你写了一个工具函数文件 utils.py,里面有很多函数。当你直接运行 python utils.py 时,你想测试这些函数。但当你 import utils 时,你只想用里面的函数,不想看到测试代码跑出来。
if __name__ == "__main__": 就是干这个的——**区分"被导入"和"被运行"**。
代码块结构:大括号 vs 缩进
C# 用大括号 {} 标记代码块:
if (x > 0)
{
Console.WriteLine("正数");
}
else
{
Console.WriteLine("非正数");
}
Python 用缩进(4 个空格)标记代码块:
if x > 0:
print("正数")
else:
print("非正数")
关键区别:
| 特性 | C# | Python |
|---|---|---|
| 代码块标记 | {} |
缩进(4 空格) |
| 缩进 | 风格建议,不影响编译 | 语法要求,缩进错了就报错 |
| 空格 vs Tab | 不敏感 | 强烈建议用空格 |
Python 的缩进不是"建议",是"强制"。缩进不对,代码直接报错。这是 Python 最大的"坑"之一,也是它最优雅的地方——强制统一代码风格。
为什么 Guido 要这样设计?
因为 Guido van Rossum(Python 之父)认为:代码的可读性比任何东西都重要。缩进强制让你的代码结构清晰可见,不会出现 C# 那种"花括号地狱":
// 这段代码你看出嵌套了几层了吗?
if (a) { if (b) { if (c) { for (int i=0; i<10; i++) { if (d) { ... } } } } }
Python 这样写,一眼就能看出层级:
if a:
if b:
if c:
for i in range(10):
if d:
...
注释方式
// C# 单行注释
/* C# 多行注释 */
/// C# XML 文档注释
/// <summary>这是一个方法</summary>
# Python 单行注释
'''
Python 多行注释
(实际上是多行字符串)
'''
# Python 文档字符串
def hello():
"""这是一个函数的文档字符串"""
print("Hello")
Python 的"多行注释"实际上是多行字符串,但它不会被赋值给任何变量,所以效果和注释一样。文档字符串 """...""" 是 Python 的"官方"文档注释方式。
坑点来了:Python 的 ''' 不是真正的注释,它会被解释器解析。如果你在函数里写:
def foo():
'''这是一个文档字符串'''
pass
'''这不是注释,这是字符串!'''
print("hello")
第二个 ''' 会被当作一个字符串表达式,虽然不会执行,但会浪费内存。所以多行注释还是用 # 每行写。
文件组织
| 对比项 | C# | Python |
|---|---|---|
| 文件扩展名 | .cs |
.py |
| 文件和类的关系 | 通常一个文件一个类 | 没有强制关系 |
| 命名空间 | 显式声明 | 通过目录和 __init__.py 组织 |
| 项目文件 | .csproj |
无(或 pyproject.toml) |
C# 的一个 .cs 文件通常只放一个类,Python 没这个限制,一个 .py 文件可以放任意多的类和函数。
真实场景:在 Python 项目里,你经常会看到一个 models.py 文件里放了十几个数据模型类,一个 utils.py 里放了二十多个工具函数。这在 C# 里是不可想象的,但在 Python 里很常见。
设计哲学
C# 的哲学是"显式优于隐式"——类型安全、编译检查、代码即文档,适合大型项目和团队协作。
Python 的哲学是"简洁就是美"——"人生苦短,我用 Python",适合快速开发、脚本和原型。
C# 像一个严谨的德国工程师,每一步都有明确的规范; Python 像一个随性的法国艺术家,追求的是表达的自由。
更深层的原因:
-
C# 诞生于微软,面向企业级开发,强调可维护性和团队协作
-
Python 诞生于荷兰,最初是 ABC 语言的替代品,强调开发者的幸福感
这就是为什么 C# 有很多"仪式感"(命名空间、接口、泛型),而 Python 追求"一步到位"。
迁移指南:C# 开发者最容易犯的错
-
忘记缩进:C# 的
{}可以随便写,Python 的缩进必须对齐 -
忘记冒号:
if x > 0后面必须有: -
混用 Tab 和空格:Python 3 不允许,会报
TabError -
以为
#是单行注释就随便用:#后面最好加个空格,PEP 8 规范 -
**以为没有类型就是"不安全"**:Python 有类型注解,只是可选
推荐工具:用 VS Code + Python 插件,它会帮你检查缩进和格式问题。
坑点提醒
缩进地狱——缩进错了直接报错:
if x > 0:
print("正数") # IndentationError: expected an indented block
忘记冒号——if 后面必须有冒号:
if x > 0
print("正数") # SyntaxError: invalid syntax
缩进混用——千万别空格和 Tab 混用:
if x > 0:
print("空格缩进")
print("Tab缩进") # TabError: inconsistent use of tabs and spaces
真实案例:我有个同事,从 C# 转 Python,用 VS Code 写代码。VS Code 默认用 4 个空格,但他习惯用 Tab。结果他的代码在自己机器上能跑,到别人机器上就报错。后来发现是 .editorconfig 没配好。
一句话总结
C# 的仪式感是"先搭框架再填内容",Python 的哲学是"从上往下写就行"。
下一篇咱们来聊聊变量声明这件事——C# 的 int x = 5; 和 Python 的 x = 5,看似简单的差异背后,是两种完全不同的类型系统哲学。
获取更多资源
🎁 配套资源:关注公众号「半亩码田」,回复「资料」获取:
-
C# vs Python 完整对照速查表
-
全系列思维导图
-
48章配套练习题 + 答案
-
C# 转 Python 15个血泪教训
📚 文章平台:
📦 代码仓库:
💬 欢迎点赞、收藏、转发,你的支持是我持续创作的动力!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)