WebSurfer's Home

Filter by APML

Visual Studio 2026 AI 駆動開発 - チャット

by WebSurfer 13. January 2026 18:48

先の記事「Visual Studio 2026 AI 駆動開発」に書きましたように、自分の環境の Visual Studio 2026 で GitHub Copilot Free (無償版) を利用できるように設定しました。それをどのように使うかということを少しだけですが調べたので、以下に調べたことを書きます。

チャットウィンドウ

Visual Studio 2026 の AI 駆動開発を簡単に書くと、ユーザーが主体となって開発を行うのは従来通りだが、統合された GitHub Copilot にペアプログラマーとしての役割を担ってもらい、力を合わせて開発を加速するということになります。

GitHub Copilot に丸投げして全部任せるという訳ではありません。Microsoft のドキュメント「Visual Studio の Copilot Free」の「01 ベスト プラクティス」の動画でも以下のように言ってます。

  • DON'T LET THE COPILOT FLY THE PLANE
  • DON'T LET COPILOT WRITE ALL YOUR CODE
  • CHECK THE CODE COPILOT PRODUCES

上記を基本として、どのようにしたら効果的に GitHub Copilot に支援させられるかということをユーザーが考えながら、「指示」⇒「応答」⇒「検証」⇒「改良」のループを回して開発を行い、成果物を完成させるということになるようです。

GitHub Copilot による支援には「チャット」と「コード補完」があります。それらについて自分が使ってみた例を以下に書きます。ドキュメントを読んで詳しく使い方を調べたわけではありませんので、最適な使い方ではないかもしれませんが、詳しい使い方は知らなくてもこの程度のことは容易にできるということで。

ベースとしたのは .NET Framework 4.8.1 の C# のコンソールアプリで、この記事の最後に載せたコードがアプリのプロジェクトの Program.cs です。このままで期待通り動きますが、少々問題を含んでいます。スペルミスとかもあります。後述しますが、GitHub Copilot からそれらの問題の指摘を受けることもできます。

まずこの記事では「チャット」について書きます。「コード補完」も書くと長くなりすぎるので別の記事に書くことにしました。

「チャット」には「チャットウィンドウ」を使う方法と「インラインチャット」という方法がありますので、以下にそれぞれについて分けて書きます。


(1) チャットウィンドウ

この記事の一番上の画像がチャットウィンドウです。Ask mode と Agent mode のいずれかを選べますが、デフォルトが Ask mode なので、この記事では Ask Mode で試した結果を書きます

チャットウィンドウ上で、GitHub Copilot に、この記事の下の方に載せた Program.cs のコードの説明をさせます。

チャットウィンドウに表示されているメニューの [Explain how the code in #class works] をクリックし、ドロップダウンから Program.cs を選んだ後、赤丸印の Send ボタンをクリックします。

プロンプト

上のプロンプトが GitHub Copilot に送信されます。

GitHub Copilot からプロンプトに対する応答として Summary, Step‑by‑step walkthrough, Potential issues and suggestions, Compatibility, If you want, I can: (改善提案) が返ってきます。

GitHub Copilot からの応答

自分が書いたコードではなく、どこからか入手したサンプルコードを使う場合など、何をしてるのか不明なコードの場合は、Step‑by‑step walkthrough の説明が役に立つと思います。Step‑by‑step walkthrough の説明は不要な場合でも Potential issues and suggestions の指摘は有用だと思います。

上にも書きましたがこの記事のサンプルの Program.cs のコードは少々問題を含んでいます。スペルミスもあります。それらに対して Potential issues and suggestions で以下の指摘を受けてます。

  • Typos: variable and file names have typos (Counrty.csv, counrtyList, filteredContryList). Rename to Country.csv, countryList, filteredCountryList for clarity.
  • Path handling: use Path.Combine(csvDir, csvFileName) instead of string concatenation and check File.Exists.
  • CSV robustness:
    • Validate fields.Length >= 2 before indexing to avoid IndexOutOfRangeException.
    • Skip or detect a header row if present.
  • String comparison: StartsWith(filter) is culture‑sensitive and case‑sensitive by default. For a case‑insensitive match use c.Name.StartsWith(filter, StringComparison.OrdinalIgnoreCase).
  • Memory/performance: currently the whole file is loaded into memory as List<Country>. For very large CSVs consider streaming and processing with LINQ on the fly (avoid .ToArray() if not needed).
  • Types: if Id is numeric, parse it to an int or a typed property instead of storing as string.
  • Encoding: explicit Encoding.UTF8 is good but ensure the file actually uses UTF‑8.
  • Exception handling: consider try/catch around file IO to give user-friendly errors.

If you want, I can: では以下を GitHub Copilot でやりましょうか? という提案を受けています。それを GitHub Copilot にやらせるなら、それを指示するプロンプトを書いて Send するということになります。

  • produce a small improved version demonstrating the suggested fixes (path handling, field validation, case‑insensitive filter), or
  • show how to skip a header row and handle malformed lines. Which would you prefer?

応答の下の方に以下の画像の赤枠に示したプロンプトのサンプルが表示されていますので、それを利用することもできます。

チャットウィンドウ

上の画像の赤枠部分をクリックすると、下の画像の通りそれがそのままプロンプトとして書き込まれます。その後 Send ボタン(赤丸印)をクリックすれば GitHub Copilot から応答が返ってきます。

チャットウィンドウ

応答は以下のように、チャットウィンドウ上の前回の応答(この例では上で聞いた Program.cs のコードの説明)の下に追加された形で表示されます。エディタ上のコードには自動的には反映されませんので、別途手動で修正することになります。

チャットウィンドウ

GitHub Copilot の修正案をエディタ上のコードに反映するには、上の画像の修正案のコードが表示されているウィンドウの左上にある [Apply] ボタンをクリックします。そうすると下の画像のようにエディタ上のコードに修正案を適用するための行の追加・削除が表示されます。

修正案をエディタ上のコードに反映

上の画像に「Tab to accept (1/4) Alt+Del to discrad F8 go to next」と表示されているように、修正案を受け入れる場合は Tab キーを、拒否する場合は Alt+Del キーを押します。(1/4) と表示されているのは、この例では 4 つのブロックに分けて修正案が表示されており、このブロックが 1 つ目という意味です。

以上 Ask mode で行った結果です。Microsoft のドキュメント「GitHub Copilot エージェント モードを始めよう」などの説明を読むと、Ask Mode と Agent Mode は役割もできることも全く別物だそうで、概略以下の違いがあるようです。

  • Ask Mode: 一問一答の形式で質問に答えるシンプルなモード。安全で軽量
  • Agent Mode: プロンプトの目標に達するまで実行と調整の手順を続けるモード。強力だが影響範囲が大きい

Agent Mode を使った場合の話は別の記事「GitHub Copilot Agent Mode」に書きました。


(2) インラインチャット

例えば下に載せたサンプルコードの中の Linq to Objects のコードを最適化するとします。マウスを使って該当部分を選択し、右クリックで出てくるメニューで [Chat] を選択します。

インラインチャット

(上の画像の [Chat] の下に [Copilot Actions] という項目があってその中に [Optimize Selection] というメニューがありますが、それは Chat ではなさそうです。結果も異なります。違いは未調査で分かりません)

表示されるウィンドウに / を入力するとドロップダウンにメニューが表示されるので optimize を選択します。それにより以下の通りプロンプトが生成されるので、Send ボタンをクリックして GitHub Copilot に送信します。(Send ボタンは画像では隠れて見えませんが右の方にあります)

インラインチャット

GitHub Copilot からの応答は以下の通り修正後のコードとその説明になります。エディタ上のコードには反映されませんので、必要に応じて手動で修正することになるようです (自分が知らないだけで自動的に反映する方法があるかもしれません)。

インラインチャット

上の画像の [View in chat window] をクリックすると、結果はすべてチャットウィンドウに移動されて表示されます。なので、エディタ上のコードに GitHub Copilot 修正提案を反映する場合は、そうしてからの方が良さそうです。

以上「チャット」について書きました。GitHub Copilot には「コード補完」という機能もありますがそれも書くと長くなりすぎるので別の記事に書きます。


Program.cs のコード

using Microsoft.VisualBasic.FileIO;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var csvDir = @"C:\Users\...省略...\ConsoleApp1\";
            var csvFileName = "Counrty.csv";
            var counrtyList = new List<Country>();

            using (var tfp = new TextFieldParser(csvDir + csvFileName, 
                                                 Encoding.UTF8))
            {
                tfp.TextFieldType = FieldType.Delimited;
                tfp.Delimiters = new string[] { "," };
                tfp.HasFieldsEnclosedInQuotes = true;
                tfp.TrimWhiteSpace = true;

                while (!tfp.EndOfData)
                {
                    string[] fields = tfp.ReadFields();

                    var country = new Country()
                    {
                        Id = fields[0],
                        Name = fields[1]
                    };
                    
                    counrtyList.Add(country);
                }
            }

            var filter = "Ca";
            var count = 20;
            var filteredContryList = counrtyList
                                     .Where(c => c.Name.StartsWith(filter))
                                     .Select(c => c.Name)
                                     .Take(count)
                                     .ToArray();

            foreach (var country in filteredContryList)
            {
                Console.WriteLine(country);
            }            
        }
    }

    public class Country
    {
        public string Id { get; set; } 
        public string Name { get; set; }

    }
}

Tags: , , ,

DevelopmentTools

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。ブログ2はそれ以外の日々の出来事などのトピックスになっています。

Calendar

<<  February 2026  >>
MoTuWeThFrSaSu
2627282930311
2345678
9101112131415
16171819202122
2324252627281
2345678

View posts in large calendar