Github Copilot Chat 初体验
最近因为阳了的缘故一直躺在床上。今天终于从床上爬起来了。不是因为好透了,而是因为我收到了申请Copilot Chat preview 权限通过的邮件。实在忍不住,于是起床开电脑在咳嗽声中进行了一番体验。
如何申请
https://github.com/github-copilot/chat_waitlist_signup/join
安装插件
申请通过后,邮件上就有说明。插件有2个,一个是基于 VSCode 的,一个是基于 Visual Studio 的。今天使用的是 Visual Studio 版本。
在 Marketplace 搜索 Visual Studio Extension for GitHub Copilot Preview 下载安装重启 VS 即可。
使用
在安装完插件后,随便打开一个项目,随便选择一个类,右键就有"询问 Copilot" 菜单:

点击菜单后,下面就会出现一个对话框:

用户可以在对话框进行提问

同时在侧边栏也会多出一个 Github Copilot chat 的 tab。
对话/问答
Copilot 的基本能力,比如写单元测试等,其实在以前的文章已经演示过了,这次不在重复。既然新版叫 Copilot Chat 那么肯定是跟 ChatGPT 一样是问答模式了。下面就来跟 Copilot 唠唠嗑。
minjie:
Copilot Chat 是什么?
Copilot:
Copilot Chat是 Microsoft的GitHub Copilot AI的一种特性,允许开发人员使用文本输入与AI交互,并实时获得代码建议和补全。Copilot Chat是一种旨在通过提供基于检测到的代码模式的建议来增强开发人员的生产力的工具。Copilot Chat使用机器学习算法识别模式并为各种编程活动建议代码片段。它还具有学习上一个用户交互的能力,随着时间的推移将变得更加准确。如果您需要使用Copilot Chat获取帮助进行开发工作,请在有具体问题的情况下描述清晰问题的场景与具体需求,以便我更好地帮助您。
minjie:
请问 c# int 的最大值是多少
Copilot:
The maximum value of an int in C# is 2,147,483,647 (or 0x7FFFFFFF in hexadecimal). This is because an int in C# is a signed 32-bit integer, meaning it can hold values between -2,147,483,648 and 2,147,483,647 inclusive.
Here's an example of assigning int.MaxValue to a variable in C#:
int maxVal = int.MaxValue;
This creates a new variable called maxVal of type int and assigns it the value of the maximum possible integer.
minjie:
在 dotnet 中一般怎么建立 websocket 连接,给个示例
Copilot:
using System.Net.WebSockets;
using System.Threading.Tasks;
public async Task ConnectWebSocketAsync(string url) {
using (ClientWebSocket ws = new ClientWebSocket()) {
await ws.ConnectAsync(new System.Uri(url), CancellationToken.None);
await Task.WhenAll(Receive(ws), Send(ws));
}
}
private static async Task Receive(ClientWebSocket ws) {
byte[] buffer = new byte[1024 * 4];
while (ws.State == WebSocketState.Open) {
var result = await ws.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Close) {
await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
} else {
// Process received data.
}
}
}
private static async Task Send(ClientWebSocket ws) {
while (ws.State == WebSocketState.Open) {
// Get data to send.
byte[] buffer = new byte[1024 * 4];
var result = await ws.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None);
await Task.Delay(2000);
}
}
问答可以说问啥答啥,基本上毫无破绽。
对代码进行解释
Copilot Chat 的另外一个能力就是对一段代码进行解释
比如让它对 AgileConfigClient 的核心类 ConfigClient 进行解释。首先打开 AgileConfigClient 项目,然后选中 ConfigClient 类文件,然后就可以问了。
minjie:
请问 ConfigClient 类是用来干嘛的?
Copilot:
ConfigClient is a class that allows the management and retrieval of configuration data. The class has methods that load configurations from a server and save them to a local storage. The configuration is typically represented in key/value pairs. The Get method is used to retrieve a particular key, and the GetGroup method is used to retrieve all keys under a common group name.
Here's an example usage of the ConfigClient class:
var config = new ConfigClient();
var result = config.Get("keyName");
This creates a new instance of the ConfigClient object and retrieves the value associated with the specified "keyName" string.
Copilot 准确的做出了解释,只是使用了英文,我让它使用中文,它不理我。
使用 Copilot Chat 一步步生成一个 To-do List 的 webapi 项目
下面的内容演示了如何使用 Copilot chat 一步步通过对话方式生成一个可以运行的项目。在最后我甚至想让它直接写个文章,Copilot 也写出来了,不过反正见过了 ChatGPT 的能力了也不奇怪哈。
minjie:
生成一个ToDo实体类
Copilot:
public class ToDo
{
public int Id { get; set; }
public string Task { get; set; }
}
minjie:
添加一个字段 Completed
Copilot:
public class ToDo
{
public int Id { get; set; }
public string Task { get; set; }
public bool Completed { get; set; }
}
minjie:
对这个实体类生产数据库访问类,使用 efcore
Copilot:
using Microsoft.EntityFrameworkCore;
using System;
public class MyContext : DbContext
{
public MyContext(DbContextOptions<MyContext> options) : base(options)
{ }
public DbSet<MyEntity> MyEntities { get; set; }
}
minjie:
改成 TodoContext
Copilot:
using Microsoft.EntityFrameworkCore;
using System;
public class TodoContext : DbContext
{
public TodoContext(DbContextOptions<TodoContext> options) : base(options)
{ }
public DbSet<ToDo> ToDos { get; set; }
}
minjie:
支持 sqlite
Copilot:
using Microsoft.EntityFrameworkCore;
using System;
public class TodoContext : DbContext
{
public TodoContext(DbContextOptions<TodoContext> options) : base(options)
{ }
public DbSet<ToDo> ToDos { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite("Data Source=todos.db");
}
minjie:
删除构造函数
Copilot:
using Microsoft.EntityFrameworkCore;
using System;
public class TodoContext : DbContext
{
public DbSet<ToDo> ToDos { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite("Data Source=todos.db");
}
minjie:
使用 ToDoContext 生成一个 ToDoService 类,这个类包装了该删查方法
Copilot:
public class ToDoService
{
private readonly TodoContext _context;
public ToDoService(TodoContext context)
{
_context = context;
}
public List<ToDo> GetToDos()
{
return _context.ToDos.ToList();
}
public ToDo GetToDoById(int id)
{
return _context.ToDos.Find(id);
}
public void AddToDo(ToDo todo)
{
_context.ToDos.Add(todo);
_context.SaveChanges();
}
public void UpdateToDoById(int id, ToDo todo)
{
var existingTodo = _context.ToDos.Find(id);
if (existingTodo != null)
{
existingTodo.Task = todo.Task;
existingTodo.Completed = todo.Completed;
_context.SaveChanges();
}
}
public void RemoveToDoById(int id)
{
var existingTodo = _context.ToDos.Find(id);
if (existingTodo != null)
{
_context.ToDos.Remove(existingTodo);
_context.SaveChanges();
}
}
}
minjie:
把所有方法改成异步
Copilot:
using CopilotChatPreview;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
public class ToDoService
{
private readonly TodoContext _context;
public ToDoService(TodoContext context)
{
_context = context;
}
public async Task<List<ToDo>> GetToDos()
{
return await _context.ToDos.ToListAsync();
}
public async Task<ToDo> GetToDoById(int id)
{
return await _context.ToDos.FindAsync(id);
}
public async Task AddToDoAsync(ToDo todo)
{
_context.ToDos.Add(todo);
await _context.SaveChangesAsync();
}
public async Task UpdateToDoByIdAsync(int id, ToDo todo)
{
var existingTodo = await _context.ToDos.FindAsync(id);
if (existingTodo != null)
{
existingTodo.Task = todo.Task;
existingTodo.Completed = todo.Completed;
await _context.SaveChangesAsync();
}
}
public async Task RemoveToDoByIdAsync(int id)
{
var existingTodo = await _context.ToDos.FindAsync(id);
if (existingTodo != null)
{
_context.ToDos.Remove(existingTodo);
await _context.SaveChangesAsync();
}
}
}
minjie:
生产一个控制器并且使用 ToDoService,使用 restful 方式暴露出去
Copilot:
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("[controller]")]
public class ToDoController : ControllerBase
{
private readonly ToDoService _toDoService;
public ToDoController(ToDoService toDoService)
{
_toDoService = toDoService;
}
[HttpGet]
public async Task<ActionResult<List<ToDo>>> GetAllToDos()
{
return await _toDoService.GetToDos();
}
[HttpGet("{id}")]
public async Task<ActionResult<ToDo>> GetToDoById(int id)
{
var todo = await _toDoService.GetToDoById(id);
if (todo == null)
{
return NotFound();
}
return todo;
}
[HttpPost]
public async Task<IActionResult> CreateToDoAsync(ToDo todo)
{
await _toDoService.AddToDoAsync(todo);
return CreatedAtAction(nameof(GetToDoById), new { id = todo.Id }, todo);
}
[HttpPut("{id}")]
public async Task<IActionResult> UpdateToDoByIdAsync(int id, ToDo todo)
{
await _toDoService.UpdateToDoByIdAsync(id, todo);
return NoContent();
}
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteToDoByIdAsync(int id)
{
await _toDoService.RemoveToDoByIdAsync(id);
return NoContent();
}
}
minjie:
在程序启动的时候把ToDoService注册到容器并且使用scope生命周期
Copilot:
// In Startup.cs file, add the following code to ConfigureServices method
services.AddScoped<ToDoService>();
minjie:
可以把以上对话整理成一篇文章吗?文章的题目叫 CopilotChat 初体验
CopilotChat 初体验
在这篇文章中,我们将一起学习如何使用 Microsoft 的 AI 编程助手,GitHub Copilot 来生成 C# 代码。同时,我们将使用一个 To-Do 应用来展示 Copilot 的功能。
注册 Copilot
要使用 GitHub Copilot,你需要注册并安装 GitHub Copilot 扩展。在安装时,你需要登录你的 GitHub 帐户和选择你喜欢的语言。
准备工作
我们将使用 Entity Framework Core 和 ASP.NET Core 创建 To-Do 应用程序。以下是创建应用程序的基本步骤。
步骤 1:创建数据库上下文
我们首先需要创建数据上下文。我们创建一个名为 TodoContext 的类,在其中我们将 ToDo 实体框架创建为数据库表。同时还将添加一个连接字符串以及一些模型构建代码。
using Microsoft.EntityFrameworkCore;
namespace CopilotChatPreview
{
public class TodoContext : DbContext
{
public TodoContext(DbContextOptions<TodoContext> options) : base(options) {}
public DbSet<ToDo> ToDos { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ToDo>().HasData(
new ToDo
{
Id = 1,
Task = "Learn AI programming",
Completed = false
},
new ToDo
{
Id = 2,
Task = "Build a chatbot",
Completed = false
});
}
}
}
步骤 2:创建服务类
我们创建一个 ToDoService 类,用于在数据库中执行增删改查操作。
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
public class ToDoService
{
private readonly TodoContext _context;
public ToDoService(TodoContext context)
{
_context = context;
}
...
public async Task RemoveToDoByIdAsync(int id)
{
var existingTodo = await _context.ToDos.FindAsync(id);
if (existingTodo != null)
{
_context.ToDos.Remove(existingTodo);
await _context.SaveChangesAsync();
}
}
}
步骤 3:创建 To-Do 控制器
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("[controller]")]
public class ToDoController : ControllerBase
{
private readonly ToDoService _toDoService;
public ToDoController(ToDoService toDoService)
{
_toDoService = toDoService;
}
...
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteToDoByIdAsync(int id)
{
await _toDoService.RemoveToDoByIdAsync(id);
return NoContent();
}
}
步骤 4:注册服务
在 ConfigureServices 方法中,我们需要将数据库上下文和服务类注册到容器中。
public void ConfigureServices(IServiceCollection services)
{
...
services.AddDbContextPool<TodoContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddScoped<ToDoService>();
...
}
总结
在这篇文章里,我们介绍了如何使用 AI 编程助手 Copilot 来生成 C# 代码。我们还介绍了如何使用 Entity Framework Core 创建和操纵数据库表。通过这篇文章,你已经开始掌握了如何使用 AI 编程助手来让开发 C# 应用程序变得更加轻松和高效。
总结
本想让 Copilot 帮我总结一下,最后还是我自己来总结吧。本次初步体验了 Copilot chat 的一些基本能力。比如如何问答,如何分析代码。特别是最后一步步全程使用对话方式生成一个可以运行的项目的内容,还是挺精彩的。作为一个 AI 助手是完全合格的。不过说实话没有第一次使用 Copilot 的时候的那种震撼。为啥?因为 ChatGPT 珠玉在前,短短的一段时间,已经让我们把对 AI 的期望拉到了前所未有的高度。Copilot chat 作为 ChatGPT 模型在垂直领域的实践,还需好好打磨,让我们期待一下正式版吧。
Github Copilot Chat 初体验的更多相关文章
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- Microsoft IoT Starter Kit 开发初体验
1. 引子 今年6月底,在上海举办的中国国际物联网大会上,微软中国面向中国物联网社区推出了Microsoft IoT Starter Kit ,并且免费开放1000套的申请.申请地址为:http:// ...
- protobuf初体验
概念介绍 Protocol buffers 是google公司的与语言无关.与平台无关的.可扩张的为序列化话结构数据,就像xml一样,办事更加的小巧.快速.简单.Protocol buffers 目前 ...
- Java8初体验(二)Stream语法详解
感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 上篇文章Java8初体验(一)lambda表达式语法比 较详细的介绍了lambda表达式的方方面面,细心的读者会发现那篇文章的例 ...
- SignalR初体验
简介 ASP .NET SignalR[1] 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以 ...
- node.js 初体验
node.js 初体验 2011-10-31 22:56 by 聂微东, 174545 阅读, 118 评论, 收藏, 编辑 PS: ~ 此篇文章的进阶内容在为<Nodejs初阶之express ...
- grunt 构建工具(build tool)初体验
操作环境:win8 系统,建议使用 git bash (window下的命令行工具) 1,安装node.js 官网下载:https://nodejs.org/ 直接点击install ,会根据你的操 ...
- 文档数据库RavenDB-介绍与初体验
文档数据库RavenDB-介绍与初体验 阅读目录 1.RavenDB概述与特性 2.RavenDB安装 3.C#开发初体验 4.RavenDB资源 不知不觉,“.NET平台开源项目速览“系列文章已经1 ...
- flutter初体验
flutter初体验 和flutter斗争了两个周末,基本弄清楚了这个玩意的布局和一些常用组件了. 在flutter里面,所有东西都是组件Widget.我们像拼接积木一样拼接Widget,拼接的关键词 ...
- 微信小程序初体验,入门练手项目--通讯录,部署上线(二)
接上一篇<微信小程序初体验,入门练手项目--通讯录,后台是阿里云服务器>:https://www.cnblogs.com/chengxs/p/9898670.html 开发微信小程序最尴尬 ...
随机推荐
- vite不能用@做为路径的解决方法
vite创建vue3后,发现原来用@做为路径的不能用了,报错信息是 Internal server error: Failed to resolve import "@ 在网上查了一下资料, ...
- 10.4 提高叠加处理速度(2) (harib07d)
ps:能力有限,若有错误及纰漏欢迎指正.交流 sheet_refreshsub void sheet_refreshsub(struct SHTCTL *ctl, int vx0, int vy0, ...
- yhm的丘赛题解(其中的一些简单题)
有选择地做了丘赛里的一些简单题,不定期更新 目录 [简单组合数学]2011丘赛个人[应数计算数学概统]第3题题解 [拉格朗日多项式插值]2011丘赛个人[应数计算数学概统]第2题题解 [概率] ...
- 用户地址管理---新增、设置默认地址、根据id查询所有地址、查询默认地址、查询指定用户的全部地址
导入用户地址簿相关功能代码 需求分析: 地址簿,指的是移动端消费者用户的地址信息,用户登录成功后可以维护自己的地址信息.同一个用户可以有多个地址信息,但是只能有一个默认地址. 用户的地址信息会存储在a ...
- Salesforce LWC学习(十二) Dependence Picklist实现
本篇可参看: Salesforce LWC学习(六) @salesforce & lightning/ui*Api Reference salesforce零基础学习(八十七)Apex 中Pi ...
- FastDFS 使用流程
一.什么是FastDFS? FastDFS 是用 C 语言编写的一款开源的分布式文件系统,对文件进行管理,主要功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡 ...
- Go语言:利用 TDD 逐步为一个字典应用创建完整的 CRUD API
前言 在数组这一章节中,我们学会了如何按顺序存储值.现在,我们再来看看如何通过键存储值,并快速查找它们. Maps 允许你以类似于字典的方式存储值.你可以将键视为单词,将值视为定义. 所以,难道还有比 ...
- JQ-DOM与元素的操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [Linux]Xshell连接Centos7能Ping通但无法连接问题[ssh(d)+firewalld/iptables+chkconfig]
一 方案与思路 0 xshell客户端监测是否能够ping通目标服务器. 前提:知晓目标服务器IP地址 Linux: ifconfig -a Windows: ipconfig -a 1 利用fire ...
- 新旧版本功能对比 | v1.5.0 全新升级
Hi~社区的小伙伴们大家好呀! CloudQuery 最新 1.5.0 社区版本即将于 4月14日 发布,正式上线前,我们迫不及待与大家分享与 v1.4 相比,v1.5.0 在性能和功能上有哪些更新和 ...