本来打算用“情感分析AI”来带大家开发第一个AI应用的,但是后来想了想,还是“找bug的AI”更加贴合咱们程序员的需求。
各位C#老铁,写代码一时爽,审查火葬场!每次CR(CodeReview)都要逐行看规范、找bug、想优化,半天就过去了,还容易漏!
今天直接带大家实现一个AI代码审查神器:用Roslyn(C#编译器API)做语法/语义精准分析 + OpenAI GPT-4o做智能优化建议,10分钟搭好,一键审查,规范、bug、优化全搞定,效率直接拉满!
一、先搞懂:为什么要“Roslyn + OpenAI”双剑合璧?
1. Roslyn:C#代码的“火眼金睛”
大白话:微软官方的C#编译器API,能精准解析代码语法、语义、结构,比纯文本分析靠谱100倍!
核心能力:
语法树解析:知道代码是类、方法、变量还是表达式
语义分析:知道变量类型、方法签名、引用关系
诊断检查:发现语法错误、类型错误、空引用、未赋值等问题
代码重构:自动重命名、提取方法、优化语法
优势:支持C# 13/.NET 9最新语法,和VS/ Rider无缝兼容
2. OpenAI GPT-4o:代码的“智能军师”
大白话:读过万亿行代码的超级专家,能理解业务逻辑、给出优化建议、生成修复代码。
核心能力:
代码规范检查:符合.NET约定、命名规范、设计模式
bug检测:逻辑漏洞、性能问题、安全风险
优化建议:简化代码、提升性能、减少冗余
生成修复代码:直接给出可运行的优化版代码
优势:多模态、上下文理解强、支持C#最新语法,比传统Lint工具智能N倍
3. 组合拳:1+1>2
Roslyn 负责精准、底层、结构化分析(语法/语义/诊断)
OpenAI 负责智能、高层、业务化分析(规范/优化/逻辑)
结果:既准又智能,比纯Roslyn更懂业务,比纯OpenAI更精准!
二、环境准备(5分钟搞定)
1. 安装NuGet包(2026最新版)
# Roslyn核心包(语法/语义分析)
Install-Package Microsoft.CodeAnalysis.CSharp
Install-Package Microsoft.CodeAnalysis.Workspaces.MSBuild
# OpenAI SDK(GPT-4o调用)
Install-Package Azure.AI.OpenAI # 推荐(国内稳定)
# 或
Install-Package OpenAI # 国际版
2. 获取OpenAI API Key
方式1:Azure OpenAI(推荐,国内稳定,支持GPT-4o)
注册Azure账号 → 创建OpenAI服务 → 获取Endpoint + API Key + 部署名(gpt-4o)
方式2:OpenAI官方(国际版,需境外网络)
注册OpenAI账号 → 获取API Key
3. 项目结构(简单清晰)
AICodeReview/
├── Program.cs # 主程序
├── RoslynAnalyzer.cs # Roslyn代码分析器
├── OpenAICodeReviewer.cs # OpenAI代码审查器
└── CodeReviewResult.cs # 审查结果模型
三、核心代码实现(10分钟写完)
1. 第一步:Roslyn代码分析器(精准解析+诊断)
RoslynAnalyzer.cs
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Diagnostics;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
public class RoslynAnalyzer
{
/// <summary>
/// 分析C#代码,返回语法树、语义模型、诊断结果
/// </summary>
public async Task<(SyntaxTree SyntaxTree, SemanticModel SemanticModel, IEnumerable<Diagnostic> Diagnostics)> AnalyzeCodeAsync(string code)
{
// 1. 解析语法树
var syntaxTree = CSharpSyntaxTree.ParseText(code);
// 2. 创建编译对象
var compilation = CSharpCompilation.Create("AICodeReview")
.AddSyntaxTrees(syntaxTree)
.AddReferences(MetadataReference.CreateFromFile(typeof(object).Assembly.Location))
.AddReferences(MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location));
// 3. 获取语义模型
var semanticModel = compilation.GetSemanticModel(syntaxTree);
// 4. 获取诊断结果(语法/语义错误)
var diagnostics = compilation.GetDiagnostics()
.Where(d => d.Severity >= DiagnosticSeverity.Warning);
return (syntaxTree, semanticModel, diagnostics);
}
/// <summary>
/// 获取代码结构信息(类、方法、变量等)
/// </summary>
public IEnumerable<ISymbol> GetAllSymbols(SemanticModel semanticModel, SyntaxNode rootNode)
{
return rootNode.DescendantNodes()
.Select(node => semanticModel.GetDeclaredSymbol(node))
.Where(symbol => symbol != null);
}
}
2. 第二步:OpenAI代码审查器(智能优化+建议)
OpenAICodeReviewer.cs
using Azure.AI.OpenAI;
using System.ClientModel;
using System.Threading.Tasks;
public class OpenAICodeReviewer
{
private readonly OpenAIClient _client;
private readonly string _deploymentName;
public OpenAICodeReviewer(string endpoint, string apiKey, string deploymentName)
{
_client = new OpenAIClient(new Uri(endpoint), new ApiKeyCredential(apiKey));
_deploymentName = deploymentName;
}
/// <summary>
/// 调用GPT-4o进行代码审查
/// </summary>
public async Task<string> ReviewCodeAsync(string code, IEnumerable<Diagnostic> diagnostics, IEnumerable<ISymbol> symbols)
{
// 构建提示词(2026最新优化版,精准+高效)
var prompt = $@"
你是一位资深C#/.NET架构师,擅长代码审查、规范检查、bug检测和性能优化。
请审查以下C#代码,按照【规范检查】【bug检测】【优化建议】【修复代码】四个部分输出结果,要求:
1. 规范检查:符合.NET命名规范、代码风格、设计模式
2. bug检测:语法错误、语义错误、逻辑漏洞、空引用、性能问题、安全风险
3. 优化建议:简化代码、提升性能、减少冗余、增强可读性
4. 修复代码:给出可直接运行的优化版代码
【Roslyn诊断结果】:
{string.Join("\n", diagnostics.Select(d => $"[{d.Severity}] {d.GetMessage()} at line {d.Location.GetLineSpan().StartLinePosition.Line + 1}"))}
【代码结构】:
{string.Join("\n", symbols.Select(s => $"{s.Kind}: {s.Name} ({s.Type})"))}
【待审查代码】:
{code}
";
// 调用GPT-4o
var response = await _client.CompleteChatAsync(
_deploymentName,
new[] { new ChatMessage(ChatRole.User, prompt) },
new ChatCompletionOptions { Temperature = 0.1f, MaxTokens = 4096 }
);
return response.Value.Content[0].Text;
}
}
3. 第三步:主程序(一键审查)
Program.cs
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine(" C# AI代码审查工具(2026最新版)");
Console.WriteLine("=====================================");
// 1. 配置(替换为你的Azure OpenAI信息)
var endpoint = "https://xxx.openai.azure.com/";
var apiKey = "你的API Key";
var deploymentName = "gpt-4o";
// 2. 待审查代码(示例:一段有问题的C#代码)
var code = @"
public class UserService
{
public void GetUser(int id)
{
var user = GetUserFromDb(id);
Console.WriteLine(user.Name); // 可能空引用
}
private User GetUserFromDb(int id)
{
return null; // 模拟空返回
}
}
public class User
{
public string Name { get; set; }
}
";
try
{
// 3. 初始化分析器
var roslynAnalyzer = new RoslynAnalyzer();
var openAIReviewer = new OpenAICodeReviewer(endpoint, apiKey, deploymentName);
Console.WriteLine("正在用Roslyn分析代码...");
var (syntaxTree, semanticModel, diagnostics) = await roslynAnalyzer.AnalyzeCodeAsync(code);
var symbols = roslynAnalyzer.GetAllSymbols(semanticModel, syntaxTree.GetRoot());
Console.WriteLine("正在用GPT-4o审查代码...");
var reviewResult = await openAIReviewer.ReviewCodeAsync(code, diagnostics, symbols);
// 4. 输出结果
Console.WriteLine("\n=====================================");
Console.WriteLine("代码审查结果");
Console.WriteLine("=====================================\n");
Console.WriteLine(reviewResult);
}
catch (Exception ex)
{
Console.WriteLine($"\n 审查失败:{ex.Message}");
}
Console.WriteLine("\n 审查完成!");
Console.ReadLine();
}
}
4. 第四步:审查结果模型(可选,用于格式化输出)
CodeReviewResult.cs
public class CodeReviewResult
{
public string Code { get; set; }
public List<string> NormChecks { get; set; } = new();
public List<string> BugDetections { get; set; } = new();
public List<string> OptimizationSuggestions { get; set; } = new();
public string FixedCode { get; set; }
}
四、运行效果
输入代码(有问题的示例)
public class UserService
{
public void GetUser(int id)
{
var user = GetUserFromDb(id);
Console.WriteLine(user.Name); // 空引用风险
}
private User GetUserFromDb(int id)
{
return null; // 模拟空返回
}
}
public class User
{
public string Name { get; set; }
}
输出结果(GPT-4o + Roslyn 双剑合璧)
=====================================
📋 代码审查结果
=====================================
【规范检查】
1. 方法命名:GetUser 应为 GetUserById(更清晰)
2. 访问修饰符:User 类应设为 internal(默认是public,不符合封装原则)
3. 空返回:GetUserFromDb 返回null,应返回Nullable<User>或抛出异常
4. 日志:Console.WriteLine 应替换为ILogger(符合.NET最佳实践)
【bug检测】
1. 空引用异常:user.Name 可能在user为null时触发NullReferenceException
2. 未处理异常:GetUserFromDb 返回null,未做空值检查
3. 方法职责:GetUser 方法既查询又打印,违反单一职责原则
【优化建议】
1. 空值处理:使用null条件运算符 ?. 或空值检查
2. 方法拆分:将查询和打印拆分为两个方法
3. 依赖注入:使用ILogger替代Console.WriteLine
4. 可空类型:将User返回值设为User?(C# 8.0+可空引用类型)
5. 异常处理:添加try-catch或抛出特定异常
【修复代码】
public class UserService
{
private readonly ILogger<UserService> _logger;
public UserService(ILogger<UserService> logger)
{
_logger = logger;
}
public User? GetUserById(int id)
{
return GetUserFromDb(id);
}
public void PrintUserName(int id)
{
var user = GetUserById(id);
if (user == null)
{
_logger.LogWarning("用户ID {Id} 不存在", id);
return;
}
_logger.LogInformation("用户名:{Name}", user.Name);
}
private User? GetUserFromDb(int id)
{
// 模拟数据库查询
return null;
}
}
public class User
{
public string Name { get; set; } = string.Empty; // 初始化避免null
}
五、C# AI代码审查避坑指南(少走弯路)
别只用OpenAI:纯文本分析容易误判,必须结合Roslyn做语法/语义校验
别忽略token计费:GPT-4o按token收费,长代码建议分段审查,或用GPT-4o mini降低成本
别忘记空值检查:C# 8.0+可空引用类型必须开启,Roslyn能精准检测空引用风险
别忽视性能:Roslyn分析大型项目时,建议增量分析(只分析修改的文件)
别替代人工审查:AI是辅助,关键业务逻辑、安全代码必须人工复核
别用旧版SDK:2026年推荐用Azure.AI.OpenAI(v2)和Microsoft.CodeAnalysis(4.8+)
六、进阶玩法(2026最新趋势)
1. 集成到CI/CD(自动审查)
在GitHub Actions/Azure DevOps中添加步骤,每次提交自动触发AI代码审查,不合格直接拦截
示例:GitHub Action
- name: Run AI Code Review
run: dotnet run AICodeReview.csproj --code ${{ github.event.pull_request.diff_url }}
2. 集成到VS/Rider(实时审查)
开发VS扩展,在编辑器中实时显示AI审查结果,一键修复
用Roslyn Analyzer + OpenAI API,实现实时智能提示
3. 批量审查项目(整个解决方案)
用Roslyn Workspaces加载整个.sln文件,批量分析所有.cs文件
生成项目级代码质量报告,识别技术债务
4. 自定义审查规则(行业专属)
针对金融/医疗/电商等行业,定制专属审查规则(如支付安全、数据脱敏、合规检查)
用Roslyn自定义Analyzer + OpenAI提示词工程,实现行业级精准审查
💬 互动一下
你平时代码审查最头疼什么?(规范/空引用/性能/安全)
想把这个工具集成到CI/CD还是VS/Rider?
评论区留言,下期优先更你想看的进阶玩法!