使用 GitHub Copilot 程式碼完成建議來產生程式碼
GitHub Copilot 可以為許多程式設計語言和各種框架提供程式碼完成建議,但特別適用於 Python、JavaScript、TypeScript、Ruby、Go、C# 和 C++。 程式碼行完成是根據您正在撰寫之程式碼的內容產生的。 您可以接受、拒絕或部分接受 GitHub Copilot 提供的建議。
GitHub Copilot 提供了兩種產生程式碼行完成的方法:
從註解:您可以透過撰寫描述要產生之程式碼的註解來產生程式碼行完成。 GitHub Copilot 根據您撰寫的註解提供程式碼完成建議。
從程式碼:您可以透過啟動程式碼行或在完成的程式碼行後按 Enter 來產生程式碼行完成。 GitHub Copilot 根據您撰寫的程式碼提供程式碼完成建議。
使用 GitHub Copilot 從註解產生程式碼行完成
GitHub Copilot 根據註解和您應用程式的現有内容產生程式碼完成建議。
您可以使用註解來描述程式碼片段、方法、資料結構和其他程式碼項目。
假設您有下列代碼段:
namespace ReportGenerator;
class QuarterlyIncomeReport
{
static void Main(string[] args)
{
// create a new instance of the class
QuarterlyIncomeReport report = new QuarterlyIncomeReport();
// call the GenerateSalesData method
// call the QuarterlySalesReport method
}
public void QuarterlySalesReport()
{
Console.WriteLine("Quarterly Sales Report");
}
}
例如,下列批注可用來建立數據結構:
// public struct SalesData. Include the following fields: date sold, department name, product ID, quantity sold, unit price
GitHub Copilot 會根據您的程式代碼批注和編輯器中開啟的程式代碼檔案,產生一或多個程式碼完成建議。

請注意用於宣告資料結構的欄位之資料類型。 GitHub Copilot 根據您現有的程式碼和程式碼註解選取資料類型和變數名稱。 GitHub Copilot 會嘗試判斷應用程式如何使用變數,並據以定義資料類型。
當 GitHub Copilot 產生多個建議時,您可以透過選取位於 [接受] 按鈕左側的向左或向右箭 (> 或 <) 來迴圈瀏覽建議。 這可讓您檢閱並選取最符合您需求的建議。
您可以接受並非完全符合所需項目的程式碼完成建議。 不過,「修正」建議所需的變更應該清楚。 在此情況下,某些資料類型不是您想要的,但您可以在接受建議的自動完成之後加以調整。
如果沒有任何建議選項與您所需的項目相似,您可以嘗試兩件事。 若要開啟包含其他建議清單的新編輯器索引標籤,請按 ctrl + Enter 鍵。 這個快捷鍵組合會開啟包含最多 10 個建議的新索引標籤。 每個建議後面都有一個按鈕,您可以用來接受建議。 在您接受建議之後,索引標籤會自動關閉。 您的另一個選項是按 Esc 鍵來關閉建議,然後再試一次。 您可以調整程式碼註解,以提供更多內容供 GitHub Copilot 使用。
備註
GitHub Copilot 可以偶爾分階段提出建議。 如果發生這種情況,可以在按 Tab 鍵後按 Enter 鍵查看建議的其他階段。
若要接受建議的資料結構,請按 Tab 鍵或選取 [接受]。
若要修改欄位資料類型,請依如下方式更新程式碼:
public struct SalesData
{
public DateOnly dateSold;
public string departmentName;
public int productID;
public int quantitySold;
public double unitPrice;
}
快速調整程式碼完成建議有助於確保您正在建置所需的程式碼。 當大部分的程式碼基底仍然需要開發時,在開發程序中儘早進行修正尤其重要。 後續的程式代碼完成是以您已撰寫的程式代碼為基礎,因此請務必確保程式代碼盡可能準確。
使用 GitHub Copilot 從註解產生程式碼行完成
GitHub Copilot 根據註解和您應用程式的現有内容產生程式碼完成建議。 您可以使用註解來描述程式碼片段、方法、資料結構和其他程式碼項目。
使用下列步驟來完成這個練習區段:
在 [Program.cs] 檔案中,在
Main方法底下建立兩個空白程式碼行。若要建立可用於產生測試資料的資料結構,請建立以下程式碼註解,然後按 Enter:
// public struct SalesData. Include the following fields: date sold, department name, product ID, quantity sold, unit priceGitHub Copilot 根據您的程式碼註解和在應用程式中找到的任何現有程式碼產生一個或多個程式碼完成建議。
請花幾分鐘時間檢閱 GitHub Copilot 提供的程式碼完成建議。
備註
如果 GitHub Copilot 產生方法的建議,而不是資料結構的建議,則輸入 public str 並等候程式碼完成建議更新。 GitHub Copilot 會使用其他資訊來改善其建議。

請注意用於宣告資料結構的欄位之資料類型。 GitHub Copilot 根據您現有的程式碼和程式碼註解選取資料類型和變數名稱。 GitHub Copilot 會嘗試判斷應用程式如何使用變數,並據以定義資料類型。
當 GitHub Copilot 產生多個建議時,您可以透過選取位於 [接受] 按鈕左側的向左或向右箭 (
>或<) 來迴圈瀏覽建議。 這可讓您檢閱並選取最符合您需求的建議。您可以接受並非完全符合所需項目的程式碼完成建議。 不過,「修正」建議所需的變更應該清楚。 在此情況下,某些資料類型不是您想要的,但您可以在接受建議的自動完成之後加以調整。
如果沒有任何建議選項與您所需的項目相似,您可以嘗試兩件事。 若要開啟包含其他建議清單的新編輯器索引標籤,請按 ctrl + Enter 鍵。 這個快捷鍵組合會開啟包含最多 10 個建議的新索引標籤。 每個建議後面都有一個按鈕,您可以用來接受建議。 在您接受建議之後,索引標籤會自動關閉。 您的另一個選項是按 Esc 鍵來關閉建議,然後再試一次。 您可以調整程式碼註解,以提供更多內容供 GitHub Copilot 使用。
備註
GitHub Copilot 可以偶爾分階段提出建議。 如果發生這種情況,可以在按 Tab 鍵後按 Enter 鍵查看建議的其他階段。
若要接受建議的資料結構,請按 Tab 鍵或選取 [接受]。
若要修改欄位資料類型,請依如下方式更新程式碼:
public struct SalesData { public DateOnly dateSold; public string departmentName; public int productID; public int quantitySold; public double unitPrice; }快速調整程式碼完成建議有助於確保您正在建置所需的程式碼。 當大部分的程式碼基底仍然需要開發時,在開發程序中儘早進行修正尤其重要。 程式代碼完成是以您現有的程式代碼為基礎,因此請務必確保程式代碼盡可能精確。
在
SalesData資料結構下方建立兩個空白程式碼行。若要建立使用
SalesData資料結構產生測試資料的方法,請撰寫以下程式碼註解,然後按 Enter:/* the GenerateSalesData method returns 1000 SalesData records. It assigns random values to each field of the data structure */請花幾分鐘時間檢閱 GitHub Copilot 提供的程式碼完成建議。
請注意,
GenerateSalesData方法設計為傳回SalesData物件陣列。 方法產生 1000 條測試資料記錄,並將隨機值指派給SalesData資料結構的每個欄位。
您應該一律檢閱 GitHub Copilot 和 GitHub Copilot Chat 提出的建議,即使建議似乎是正確的。
備註
如果 GitHub Copilot 建議單一程式碼行,而不是已完成的
GenerateSalesData方法,請按 Ctrl + Enter 以開啟 GitHub Copilot [建議] 索引標籤。檢閱新索引標籤上的建議。在下一個步驟中,使用 [接受建議 #] 按鈕來接受建議。 GitHub Copilot 會以累加方式呈現建議。 雖然您可以累加接受程式碼完成,但最好先使用 GitHub Copilot [建議] 索引標籤來檢閱完整建議,再決定接受或捨棄。捲動程式碼完成建議,然後選取最符合需求的建議。
若要接受程式碼完成,請按 Tab 鍵。
請注意,程式碼完成建議會在用來產生
DateSold欄位的程式碼中包含語法錯誤。DateOnly接受必須以正確順序列出的三個整數值:年、月、日。若要為用於產生
DateSold欄位的程式碼指定年,請依如下方式更新程式碼行:salesData[i].DateSold = new DateOnly(2023, random.Next(1, 13), random.Next(1, 29));如有必要,請調整其他程式碼行以符合下列程式碼片段:
public SalesData[] GenerateSalesData() { SalesData[] salesData = new SalesData[1000]; Random random = new Random(); for (int i = 0; i < salesData.Length; i++) { salesData[i].dateSold = new DateOnly(2023, random.Next(1, 13), random.Next(1, 29)); salesData[i].departmentName = "Department " + random.Next(1, 11); salesData[i].productID = random.Next(1, 101); salesData[i].quantitySold = random.Next(1, 101); salesData[i].unitPrice = random.NextDouble() * 100; } return salesData; }
從程式碼註解產生程式碼的能力是 GitHub Copilot 的強大功能。 只需兩個註解,就可以產生資料結構和產生測試資料的方法。
使用 GitHub Copilot 產生程式碼行完成
GitHub Copilot 可以根據您輸入的程式碼產生程式碼行完成。 您可以透過兩種方式產生程式碼行完成:
- 開始輸入程式碼行,然後等待 GitHub Copilot 為您未完成的程式碼行建議自動完成。
- 輸入完整的程式碼行,按 Enter,然後等待 GitHub Copilot 建議自動完成下一個程式碼行。
備註
GitHub Copilot 根據您輸入的程式碼和應用程式内程式碼定義的内容產生建議的程式碼完成。 您的應用程式中可用的程式碼越多,GitHub Copilot 在產生回應時參考的上下文就越多。 GitHub Copilot 可以根據您現有的程式代碼回應,因此程式代碼的品質很重要。 隨著現有程式碼的數量和品質的增長,GitHub Copilot 建議的程式碼行完成之品質和可靠性也在增長。 GitHub Copilot 擅長為常見的編程任務和模式生成程式碼補全,尤其是在需要生成一系列相關組件時。
在本練習的這個部分中,您會使用 QuarterlySalesReport 方法。
以下是您需要完成的工作:
- 使用接受
SalesData物件集合的參數更新方法建構函式。 - 使用 GitHub Copilot 產生程式碼行完成,其用於處理季度報表的銷售資料。
- 執行應用程式並檢閱季度銷售報表。
使用下列步驟來完成這個練習區段:
依如下方式更新
QuarterlySalesReport的方法建構函式:public void QuarterlySalesReport(SalesData[] salesData)請花幾分鐘時間考慮一下需要開發的程式碼。
概念是直截了當的。 您希望程式碼根據銷售資料計算季度銷售額,然後撰寫報表。 若要做到這一點,您的程式碼需要:
- 逐一查看
salesData集合。 - 根據銷售數量和單價計算每次銷售的價值。
- 使用銷售日期來確定銷售屬於哪個季度。
- 將每個季度的銷售額加總。
- 按季度撰寫銷售報表。
一種選項是開始輸入
foreach迴圈的程式碼,然後查看 GitHub Copilot 的建議。- 逐一查看
在
QuarterlySalesReport方法中,在程式碼區塊頂端建立新的程式碼行。新程式碼行與包含
Console.WriteLine()的程式碼行之間應該至少有一個空白程式碼行。若要產生程式碼行完成,請輸入
foreach (,然後等待 GitHub Copilot 建議程式碼行完成選項。查看 GitHub Copilot 建議的程式碼完成。

建議的程式碼完成不是您想要的項目。
儘管 GitHub Copilot 建議使用
foreach迴圈來逐一查看salesData,但迴圈中沒有分析或計算。 建議的程式代碼包含Console.WriteLine您不需要或需要的語句。請花幾分鐘時間思考一下為什麼 GitHub Copilot 建議使用
Console.WriteLine陳述式。回想一下,GitHub Copilot 根據程式碼内容產生程式碼完成建議。 在這種情況下,您實際上沒有太多程式碼可供 GitHub Copilot 考慮。 情況變得更糟。
GitHub Copilot 在您的方法內看到的程式碼是
Console.WriteLine陳述式。 由於方法内沒有其他可用的内容,且您的程式碼基底中沒有其他類似的方法可供借鑒,GitHub Copilot 得出結論,您可能希望在foreach迴圈中使用Console.WriteLine陳述式。GitHub Copilot 在程式碼乾淨且聚焦的情况下效果最好。 如果您在程式碼中看到多餘的程式碼註解或陳述式,您可能需要在嘗試使用 GitHub Copilot 程式碼完成之前將其移除。
要在再次嘗試 GitHub Copilot 之前清理程式碼,請完成以下步驟:
- 取消建議的
foreach (程式碼完成。 - 删除您輸入的部分
foreach (陳述式。 - 從
QuarterlySalesReport方法中删除Console.WriteLine陳述式。
現在您應該準備好再次嘗試 GitHub Copilot 了。
- 取消建議的
確保您的
QuarterlySalesReport方法與以下程式碼類似:public void QuarterlySalesReport(SalesData[] salesData) { }將游標放在
QuarterlySalesReport方法內的空白程式碼行上,然後按 Enter。GitHub Copilot 可能需要一段時間才能產生建議的程式碼完成。
請花幾分鐘時間檢閱建議的程式碼完成。
這很重要
您收到的程式碼完成可能與以下螢幕擷取畫面中顯示的建議不同。 儘管 GitHub Copilot 只有方法名稱和參數可供使用,但這可能足以產生實用的建議。 您應該看到依季度計算銷售額的建議。 拒絕建議並重試可能會產生不同結果。

您可以透過選取
>或<迴圈瀏覽建議。請注意,建議的程式碼完成逐一查看銷售資料並執行季度銷售計算。
若要接受建議的程式碼完成,請按 Tab 鍵。
建議的程式碼完成根據銷售資料計算並顯示季度收入。
// create a dictionary to store the quarterly sales data Dictionary<string, double> quarterlySales = new Dictionary<string, double>(); // iterate through the sales data foreach (SalesData data in salesData) { // calculate the total sales for each quarter string quarter = GetQuarter(data.dateSold.Month); double totalSales = data.quantitySold * data.unitPrice; if (quarterlySales.ContainsKey(quarter)) { quarterlySales[quarter] += totalSales; } else { quarterlySales.Add(quarter, totalSales); } } // display the quarterly sales report Console.WriteLine("Quarterly Sales Report"); Console.WriteLine("----------------------"); foreach (KeyValuePair<string, double> quarter in quarterlySales) { Console.WriteLine(entry.Key + ": $" + entry.Value); }請注意,
GetQuarter方法會使用銷售的月份來判斷銷售的季度。接下來會建立
GetQuarter方法。在
QuarterlySalesReport方法下方建立兩個空白程式碼行。請注意,GitHub Copilot 建議對
GetQuarter方法進行程式碼完成。藉由
QuarterlySalesReport方法提供的内容,GitHub Copilot 可以很容易地為GetQuarter方法產生程式碼完成,根據銷售月確定季度。請花幾分鐘時間檢閱
GetQuarter方法的建議程式碼行完成。
若要接受建議的程式碼完成,請按 Tab 鍵。
public string GetQuarter(int month) { if (month >= 1 && month <= 3) { return "Q1"; } else if (month >= 4 && month <= 6) { return "Q2"; } else if (month >= 7 && month <= 9) { return "Q3"; } else { return "Q4"; } }請注意,在執行程式碼之前,需要完成
Main方法。您可以使用
Main方法中的註解來更新程式碼。將游標放在
// call the GenerateSalesData method程式碼註解的末尾,然後按 Enter。GitHub Copilot 使用註解為方法提出呼叫陳述式。
檢閱並接受 GitHub Copilot 建議的程式碼完成。
對
// call the QuarterlySalesReport method程式碼註解重複流程。您的
Main方法應該包含以下程式碼:static void Main(string[] args) { // create a new instance of the class QuarterlyIncomeReport report = new QuarterlyIncomeReport(); // call the GenerateSalesData method SalesData[] salesData = report.GenerateSalesData(); // call the QuarterlySalesReport method report.QuarterlySalesReport(salesData); }請花幾分鐘時間檢閱
QuarterlyIncomeReport類別中的程式碼。namespace ReportGenerator { class QuarterlyIncomeReport { static void Main(string[] args) { // create a new instance of the class QuarterlyIncomeReport report = new QuarterlyIncomeReport(); // call the GenerateSalesData method SalesData[] salesData = report.GenerateSalesData(); // call the QuarterlySalesReport method report.QuarterlySalesReport(salesData); } /* public struct SalesData includes the following fields: date sold, department name, product ID, quantity sold, unit price */ public struct SalesData { public DateOnly dateSold; public string departmentName; public int productID; public int quantitySold; public double unitPrice; } /* the GenerateSalesData method returns 1000 SalesData records. It assigns random values to each field of the data structure */ public SalesData[] GenerateSalesData() { SalesData[] salesData = new SalesData[1000]; Random random = new Random(); for (int i = 0; i < 1000; i++) { salesData[i].dateSold = new DateOnly(2023, random.Next(1, 13), random.Next(1, 29)); salesData[i].departmentName = "Department " + random.Next(1, 11); salesData[i].productID = random.Next(1, 101); salesData[i].quantitySold = random.Next(1, 101); salesData[i].unitPrice = random.NextDouble() * 100; } return salesData; } public void QuarterlySalesReport(SalesData[] salesData) { // create a dictionary to store the quarterly sales data Dictionary<string, double> quarterlySales = new Dictionary<string, double>(); // iterate through the sales data foreach (SalesData data in salesData) { // calculate the total sales for each quarter string quarter = GetQuarter(data.dateSold.Month); double totalSales = data.quantitySold * data.unitPrice; if (quarterlySales.ContainsKey(quarter)) { quarterlySales[quarter] += totalSales; } else { quarterlySales.Add(quarter, totalSales); } } // display the quarterly sales report Console.WriteLine("Quarterly Sales Report"); Console.WriteLine("----------------------"); foreach (KeyValuePair<string, double> quarter in quarterlySales) { Console.WriteLine(entry.Key + ": $" + entry.Value); } } public string GetQuarter(int month) { if (month >= 1 && month <= 3) { return "Q1"; } else if (month >= 4 && month <= 6) { return "Q2"; } else if (month >= 7 && month <= 9) { return "Q3"; } else { return "Q4"; } } } }此程式碼幾乎完全是使用 GitHub Copilot 產生的程式碼行完成所建立。 不過,您對程式碼建議的審查很重要,而且需要更正。 您應該一律審查 GitHub Copilot 所建議的程式碼完成,以確保程式碼符合需求。
若要檢閱報表輸出,請執行應用程式。
在 Visual Studio Code 中開啟 [終端] 視窗,然後輸入以下命令:
dotnet run輸出應顯示季度收入報表,顯示測試資料中每個部門和季度的部門名稱、季度和收入。
檢閱 [終端] 視窗中的輸出。
雖然每季結果是以隨機數值為基礎,但您應該會看到格式化為類似下列輸出的報告:
Quarterly Sales Report ---------------------- Q3: $635637.5019563352 Q4: $672247.315297204 Q2: $667269.194630603 Q1: $642769.2700531208
總結
程式代碼行完成是 GitHub Copilot 的強大功能,可協助您快速且有效率地產生程式代碼。 藉由使用批注來描述您想要產生的程式碼,您可以最少地建立數據結構、方法和其他程式代碼元素。 此外,GitHub Copilot 可以根據您輸入的程式代碼產生程式碼行完成,讓您輕鬆建置複雜的應用程式。