×

【C#程序员入门AI系列教程】手把手教你开发第一个AI程序

独孤求败 独孤求败 发表于2026-02-09 09:30:35 浏览15 评论0

抢沙发发表评论

本来打算用“情感分析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代码审查避坑指南(少走弯路)


 

     
  1. 别只用OpenAI:纯文本分析容易误判,必须结合Roslyn做语法/语义校验

  2. 别忽略token计费:GPT-4o按token收费,长代码建议分段审查,或用GPT-4o mini降低成本

  3. 别忘记空值检查:C# 8.0+可空引用类型必须开启,Roslyn能精准检测空引用风险

  4. 别忽视性能:Roslyn分析大型项目时,建议增量分析(只分析修改的文件)

  5. 别替代人工审查:AI是辅助,关键业务逻辑、安全代码必须人工复核

  6. 别用旧版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?


 

评论区留言,下期优先更你想看的进阶玩法!


群贤毕至

访客