制器坊 编程基础

C# 基础:.NET 项目、运行与异常定位

用 .NET SDK 创建并运行控制台项目。配合操作示例、图解和检查点,完成第一次练习,再逐步排查使用中的问题。

信息层级:【有据可查】= 附官方文档或可信来源链接;【社区共识】= 社区用户普遍经验,未经官方确认;【待考察/推测】= 推测或暂未能核实,请谨慎对待。

官方文档:Microsoft Learn · C#、.NET API 浏览器。【有据可查】


1. C# 用在哪?

【社区共识】微软主导的现代语言,运行在 .NET 上:Unity 与 Godot(C# 版)的游戏脚本(见 游戏引擎怎么选:目标平台、学习成本与许可)、Windows 桌面应用、Web 后端(ASP.NET Core)、跨平台工具。

图 1

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 创建并运行控制台项目。

上文已介绍概念、配置和操作示例。下面侧重第一次实际操作时的顺序、检查点和结果核对;需要查具体参数时回到对应小节。命令逐条输入,看到上一条的结果后再继续。

  1. 安装 .NET SDK 后重新打开终端,运行 dotnet --version。只有运行时而没有 SDK 时不能用 dotnet new 创建项目。

    补充说明:dotnet new 创建项目,dotnet build 编译项目,dotnet run 启动项目;这三种动作需要 SDK,而不是只有运行时。

  2. 在新的练习目录执行原文的 dotnet new console,再单独 cd 进入 HelloApp。

    补充说明:创建 HelloApp 的完整命令为 dotnet new console -o HelloApp;-o 指定输出目录,创建成功后再运行 cd HelloApp。

  3. 打开 Program.cs,用原文示例替换模板内容并保存;先不把 Unity 的 MonoBehaviour 脚本放进控制台项目。

    补充说明:这里替换的是项目模板原有的问候代码。原文的 dotnet run 展示在名单代码之前;要看到名单结果,应先保存这份完整示例,再运行项目。

  4. 单独运行 dotnet build,确认没有编译错误,再运行 dotnet run。

    补充说明:构建失败时先按第一条 error CSxxxx 修正,不把之前构建留下的输出当作本次结果。

  5. 预期出现 Alice 和 Bob 两行问候。修改名单后保存并重新运行,确认变化。

    补充说明:完整输出应为 Hello, Alice! 与 Hello, Bob!。List<string> 保存名单,foreach 遍历,$"Hello, {n}!" 把当前名字插入文字。

  6. 遇到 CS 编号先定位编译错误;运行后出现异常再读堆栈。Unity 报错需在 Unity Console 与场景引用中另行检查。

    补充说明:速查表的省略号与未定义的 nums 等是片段提示,不能原样并入程序;Unity 脚本应结合 Unity Console、Inspector 引用和引擎版本定位。

继续浏览制器坊 返回顶部 ↑
教程图解100%
教程图解
灵犀台