信息层级:【有据可查】= 附官方文档或可信来源链接;【社区共识】= 社区用户普遍经验,未经官方确认;【待考察/推测】= 推测或暂未能核实,请谨慎对待。
官方文档:Microsoft Learn · C#、.NET API 浏览器。【有据可查】
1. C# 用在哪?
【社区共识】微软主导的现代语言,运行在 .NET 上:Unity 与 Godot(C# 版)的游戏脚本(见 游戏引擎怎么选:目标平台、学习成本与许可)、Windows 桌面应用、Web 后端(ASP.NET Core)、跨平台工具。
2. Hello World
dotnet new console -o HelloApp # 需安装 .NET SDK
cd HelloApp
dotnet run
// Program.cs(顶级语句写法)
using System;
using System.Collections.Generic;
var names = new List<string> { "Alice", "Bob" };
foreach (var n in names)
{
Console.WriteLine($"Hello, {n}!");
}
【有据可查】dotnet new / dotnet run 见 .NET CLI 文档。
3. 语法速查
| 主题 | 示例 | 说明 |
|---|---|---|
| 变量 | int a = 1; var s = "hi"; |
var 由编译器推断 |
| 可空 | string? name = null; |
开启可空引用类型后,编译器会提醒空值风险 |
| 字符串插值 | $"年龄 {age}" |
— |
| 条件/循环 | if、switch、for、foreach、while |
与 C 系类似 |
| 方法 | int Add(int x, int y) => x + y; |
表达式体 |
| 类 | public class Dog { public string Name { get; set; } } |
属性 get/set |
| 记录 | public record Point(int X, int Y); |
不可变数据类型 |
| 接口 | interface IShape { double Area(); } |
— |
| 泛型 | List<T>、Dictionary<TKey, TValue> |
— |
| lambda + LINQ | nums.Where(n => n > 2).Select(n => n * 2) |
集合查询 |
| 异步 | async Task<string> LoadAsync() { await ...; } |
异步 I/O |
| 异常 | try { } catch (IOException ex) { } finally { } |
— |
4. 常用 API
| 命名空间 | 常用 | 用途 |
|---|---|---|
System |
Console.WriteLine、Math.Max、DateTime.Now、int.Parse / int.TryParse |
基础 |
System.Collections.Generic |
List<T>、Dictionary<K,V>、HashSet<T>、Queue<T> |
集合 |
System.Linq |
Where、Select、OrderBy、First、FirstOrDefault、Any、Count |
查询 |
System.IO |
File.ReadAllText、File.WriteAllText、Path.Combine、Directory.Exists |
文件 |
System.Text.Json |
JsonSerializer.Serialize / Deserialize |
JSON |
System.Net.Http |
HttpClient |
网络请求 |
System.Threading.Tasks |
Task、Task.WhenAll |
异步 |
Unity 专属(不属于 .NET 标准库):MonoBehaviour、Start()、Update()、GetComponent<T>()、Debug.Log()——见 Unity 脚本 API。【有据可查】
5. 读懂报错
5.1 编译错误:认准 CSxxxx 编号
Program.cs(7,13): error CS0103: The name 'conut' does not exist in the current context
| 部分 | 含义 |
|---|---|
Program.cs(7,13) |
文件(行, 列) |
CS0103 |
错误编号——可以直接搜索,微软文档对每个编号都有说明 |
| 编号 | 含义 | 常见原因 |
|---|---|---|
| CS0103 | 名称不存在 | 拼写错、未声明、作用域外 |
| CS0246 | 找不到类型或命名空间 | 缺 using 或缺 NuGet 包/程序集引用 |
| CS1002 | 应输入 ; |
漏分号 |
| CS0029 | 无法隐式转换类型 | 类型不匹配 |
| CS1061 | 类型不包含某成员 | 方法名写错、对象类型不对 |
| CS0161 | 并非所有代码路径都返回值 | 某个分支漏了 return |
| CS8618 / CS8602 | 可空性警告 | 可能为 null 的对象被使用 |
来源:C# 编译器错误参考【有据可查】
5.2 运行时异常
| 异常 | 含义 | 常见原因 |
|---|---|---|
NullReferenceException |
对 null 调用成员 | Unity 中最常见:Inspector 里没拖引用、GetComponent 没找到 |
IndexOutOfRangeException / ArgumentOutOfRangeException |
越界 | 下标错误 |
InvalidOperationException |
当前状态不允许该操作 | 如遍历集合时修改它 |
FormatException |
格式不对 | int.Parse("abc"),改用 TryParse |
FileNotFoundException / DirectoryNotFoundException |
路径不对 | 相对路径基准 |
KeyNotFoundException |
字典无该键 | 用 TryGetValue |
读堆栈(Stack Trace):异常类型和消息在最上面;at 命名空间.类.方法() in 文件:line N 列出调用链——找第一条属于你自己代码的行。【社区共识】
6. 和 AI 协作的提示【社区共识】
- 告诉 AI 你的环境:".NET 8 控制台"还是"Unity 6 的 MonoBehaviour 脚本"——两者 API 差别很大。
- Unity 报错常在 Console 窗口,双击可跳到出错行;把整条消息和堆栈一起给 AI。
7. 本篇无法核实/需谨慎的点
- Unity 使用的 C# 语言版本与 .NET 最新版本可能不同步,部分新语法在 Unity 中不可用。
- 可空引用类型默认是否开启取决于项目模板。
小白练习:把本文流程逐项走通
练习目标:用 .NET SDK 创建并运行控制台项目。
上文已介绍概念、配置和操作示例。下面侧重第一次实际操作时的顺序、检查点和结果核对;需要查具体参数时回到对应小节。命令逐条输入,看到上一条的结果后再继续。
-
安装 .NET SDK 后重新打开终端,运行 dotnet --version。只有运行时而没有 SDK 时不能用 dotnet new 创建项目。
补充说明:
dotnet new创建项目,dotnet build编译项目,dotnet run启动项目;这三种动作需要 SDK,而不是只有运行时。 -
在新的练习目录执行原文的 dotnet new console,再单独 cd 进入 HelloApp。
补充说明:创建
HelloApp的完整命令为dotnet new console -o HelloApp;-o指定输出目录,创建成功后再运行cd HelloApp。 -
打开 Program.cs,用原文示例替换模板内容并保存;先不把 Unity 的 MonoBehaviour 脚本放进控制台项目。
补充说明:这里替换的是项目模板原有的问候代码。原文的
dotnet run展示在名单代码之前;要看到名单结果,应先保存这份完整示例,再运行项目。 -
单独运行 dotnet build,确认没有编译错误,再运行 dotnet run。
补充说明:构建失败时先按第一条
error CSxxxx修正,不把之前构建留下的输出当作本次结果。 -
预期出现 Alice 和 Bob 两行问候。修改名单后保存并重新运行,确认变化。
补充说明:完整输出应为
Hello, Alice!与Hello, Bob!。List<string>保存名单,foreach遍历,$"Hello, {n}!"把当前名字插入文字。 -
遇到 CS 编号先定位编译错误;运行后出现异常再读堆栈。Unity 报错需在 Unity Console 与场景引用中另行检查。
补充说明:速查表的省略号与未定义的
nums等是片段提示,不能原样并入程序;Unity 脚本应结合 Unity Console、Inspector 引用和引擎版本定位。
