本来打算用“情感分析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.CSharpInstall-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-4ovar 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时触发NullReferenceException2. 未处理异常:GetUserFromDb 返回null,未做空值检查3. 方法职责:GetUser 方法既查询又打印,违反单一职责原则【优化建议】1. 空值处理:使用null条件运算符 ?. 或空值检查2. 方法拆分:将查询和打印拆分为两个方法3. 依赖注入:使用ILogger替代Console.WriteLine4. 可空类型:将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 Reviewrun: 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?
评论区留言,下期优先更你想看的进阶玩法!
评论 (0)