C# 基础语法
环境装好后,我们来系统过一遍 C# 的基础语法。这一章不涉及复杂概念,只讲程序"长什么样"——结构、命名空间、注释、关键字。读完你就能看懂任何 C# 代码的大致框架。
一、C# 程序的基本结构
一个完整的传统 C# 程序包含四部分:using 引入、namespace 命名空间、class 类、Main 入口方法。看这个例子:
using System; // 引入命名空间
using System.Collections.Generic;
namespace MyGame // 命名空间(类似 Java 的 package)
{
class Program // 类
{
static void Main(string[] args) // 主入口
{
Console.WriteLine("Hello, C#!");
}
}
}几个要点:
using:引入命名空间,类似 Java 的 import、Python 的 import、C++ 的 include。没引入就用全名,如System.Console.WriteLine。namespace:命名空间,用来组织类型,避免命名冲突。一般按"公司.项目.模块"命名,如MyCompany.MyApp.Services。class:C# 一切皆对象,所有代码都写在类里。Main:程序入口,大写 M(区别于 Java/C 的小写 main)。可以是void或int返回,可带string[] args参数。
二、顶级语句(C# 9+ 简化写法)
新版 C# 引入了顶级语句:整个 Program.cs 可以只有几行代码,编译器自动生成 Program 类与 Main 方法。这对初学者非常友好:
// C# 9+ 顶级语句:可省略 class/using/Main
// 默认 ImplicitUsings 开启,常用 using 自动添加
Console.WriteLine("Hello, C#!");
// 整个文件就是 Main 方法体,return 即退出
return 0;本系列示例大部分用顶级语句书写,简洁直观。等学完高级概念,你再回头理解"它本质就是 Main 方法"即可。
三、命名空间
命名空间用来避免命名冲突。比如你写了一个 UserService,微软的 BCL 里也有同名类——只要命名空间不同就能共存。
namespace MyApp.Services
{
public class UserService { /* ... */ }
public class OrderService { /* ... */ }
}
// C# 10+ 文件范围命名空间(推荐,少一层缩进)
namespace MyApp.Services;
public class UserService { /* ... */ }
public class OrderService { /* ... */ }访问其他命名空间的内容,要么 using 引入,要么写全名 MyApp.Services.UserService。命名空间可以嵌套,但文件范围命名空间(C# 10+)只能有一个、必须在文件第一行(不含 using)。
四、注释
C# 的注释和 C/Java/JS 几乎一样,但多了一种特殊的 XML 文档注释:
// 单行注释:双斜杠,到行尾
/* 多行注释:用斜杠星号包裹,
可以跨多行 */
/// <summary>
/// XML 文档注释:三斜杠开头
/// 编译器会生成 API 文档,IDE 智能提示会读取
/// </summary>
/// <param name="name">用户名</param>
public void Greet(string name) { }三斜杠 /// 注释会被编译器读取,生成 API 文档(类似 Java 的 Javadoc)。在 VS/VS Code 里,光标悬停方法上显示的智能提示就来自这里。写公共 API 时强烈建议加 XML 注释。
五、分号与花括号
C# 语句必须以分号结尾;代码块用花括号包裹(这点和 C/Java 一样,和 Python 的缩进不同)。花括号风格通常是左括号不换行(Allman 风格在 C# 社区也有人用,但官方示例基本是 K&R)。
// ✅ 正确:左花括号不换行(C# 惯例)
if (x > 0)
{
DoSomething();
}
// ❌ C# 里这种写法少见(不像 Java/JS 流行风格)
if (x > 0)
{
DoSomething();
}
// 语句必须以分号结尾
int a = 1;
Console.WriteLine(a);注意 C# 不像 Go 那样强制左括号同行——但社区习惯就是这样,跟着主流写就对了。VS/VS Code 默认格式化工具会自动整理。
六、大小写敏感
C# 是大小写敏感的语言。name 和 Name 是两个不同的标识符。命名规范很重要:
- PascalCase:类名、方法名、属性名都用大驼峰。如
UserService、GetName、UserName。 - camelCase:局部变量、参数用小驼峰。如
userName、totalCount。 - 接口:
I前缀 + PascalCase。如IDisposable、IList<T>。 - 常量:全大写或 PascalCase。
MAX_RETRY或MaxRetry。
遵守这套规范能让你写的代码"看起来像 C# 该有的样子",团队协作顺畅。
七、C# 的关键字
C# 大约有 80 个保留关键字(contextual keywords 不算在内),不能用作标识符。常用的有:
- 类型:
classstructinterfaceenumrecorddelegate - 修饰:
publicprivateprotectedinternalstaticconstreadonlyabstractsealedvirtualoverrideasyncawait - 控制流:
ifelseswitchforforeachwhiledobreakcontinuereturnthrowtrycatchfinally - 引用:
usingnamespacethisbasenewisastypeofvar - 异常/资源:
trythrowcatchfinallylockfixed
看到不熟的关键字不用慌,后续每个都会单独讲。初学者常用的就 30 来个。
八、上下文关键字(Contextual Keywords)
C# 还有一类上下文关键字,只在特定语法里有意义,其他位置可以当变量名。比如 var、value、partial、select、where、get、set、orderby、group、by。在 LINQ 里它们大量出现,但作为变量名也合法。
九、入口与命令行参数
如果需要读取命令行参数,Main 方法可以带 string[] args:
// 传统写法
class Program
{
static void Main(string[] args)
{
foreach (var arg in args)
Console.WriteLine(arg);
}
}
// 顶级语句下,args 直接是顶级变量
foreach (var arg in args)
Console.WriteLine(arg);运行 dotnet run -- a b c(注意 -- 分隔符)会把 a b c 作为参数传入。
小结
这一章你了解了 C# 程序的整体骨架:using → namespace → class → Main;知道了注释和命名空间规则;记住了关键字的存在和大致分类。下一篇我们看 C# 的变量声明——程序操作数据的基本单位。
← 上一篇 C# 环境安装
下一篇 C# 变量 →