Tutorial: Memperluas aplikasi konsol C# dan debug di Visual Studio (bagian 2 dari 2)
Di bagian 2 dari seri tutorial ini, Anda terjun sedikit mendalam ke fitur bangun dan debug Visual Studio yang Anda butuhkan untuk pengembangan harian. Fitur-fitur ini termasuk mengelola beberapa proyek, penelusuran kesalahan, dan mereferensikan paket pihak ketiga. Jalankan aplikasi konsol C# yang Anda buat di Bagian 1 tutorial ini, dan jelajahi beberapa fitur lingkungan pengembangan terpadu (IDE) untuk Visual Studio. Tutorial ini adalah bagian ke-2 dari seri tutorial dua bagian.
Dalam tutorial ini, Anda menyelesaikan tugas-tugas berikut:
- Tambahkan proyek kedua.
- Referensikan pustaka dan tambahkan paket.
- Men-debug kode Anda.
- Periksa kode Anda yang lengkap.
Prasyarat
Untuk mengerjakan artikel ini, Anda dapat menggunakan salah satu aplikasi kalkulator ini:
- Aplikasi konsol kalkulator dari bagian 1 tutorial ini.
- Aplikasi kalkulator C# di repositori vs-tutorial-samples. Untuk memulai, buka aplikasi dari repositori.
Menambahkan proyek lainnya
Kode dunia nyata melibatkan proyek yang bekerja sama dalam sebuah solusi. Anda dapat menambahkan proyek pustaka kelas ke aplikasi kalkulator yang menyediakan beberapa fungsi kalkulator.
Di Visual Studio, gunakan perintah menu File>Tambahkan>Proyek Baru untuk menambahkan proyek baru. Anda juga dapat mengeklik kanan solusi pada Penjelajah Solusi untuk menambahkan proyek dari menu konteks.
Pada Penjelajah Solusi, klik kanan node solusi dan pilih Tambahkan>Proyek Baru.
Di jendela Tambahkan proyek baru, ketik pustaka kelas di kotak Pencarian. Pilih pola dasar proyek Pustaka kelas C#, lalu pilih Berikutnya.
Pada layar Konfigurasikan proyek baru Anda, ketik nama proyek CalculatorLibrary, lalu pilih Berikutnya.
Pilih .NET 3.1 saat diminta. Visual Studio membuat proyek baru dan menambahkannya ke solusi.
Ganti nama file Class1.cs menjadi CalculatorLibrary.cs. Untuk mengganti nama file, Anda bisa mengklik kanan nama di Penjelajah Solusi dan memilih Ganti Nama, pilih nama dan tekan F2, atau pilih nama dan pilih lagi untuk mengetik.
Sebuah pesan mungkin akan muncul untuk memastikan penggantian nama referensi ke
Class1
dalam file tersebut. Anda dapat menjawab sesukanya karena Anda akan mengganti kode di langkah berikutnya.Sekarang, tambahkan referensi proyek agar proyek pertama dapat menggunakan API yang diekspos oleh pustaka kelas baru. Klik kanan node Dependensi pada proyek Kalkulator dan pilih Tambahkan Referensi Proyek.
Kotak dialog Manajer Referensi muncul. Dalam kotak dialog ini, Anda dapat menambahkan referensi ke proyek, rakitan, dan COM DLL lainnya yang dibutuhkan oleh proyek Anda.
Dalam kotak dialog Pengelola Referensi, pilih kotak centang untuk proyek CalculatorLibrary, lalu pilih Oke.
Referensi proyek muncul di node Proyek pada Penjelajah Solusi.
Pada Program.cs, pilih kelas
Calculator
dan semua kodenya, lalu tekan Ctrl+X untuk memotongnya. Kemudian, di CalculatorLibrary.cs, tempelkan kodenya ke namespaceCalculatorLibrary
.Selain itu, tambahkan
public
sebelum kelas Calculator untuk mengeksposnya di luar pustaka.CalculatorLibrary.cs seharusnya menyerupai kode berikut:
using System; namespace CalculatorLibrary { public class Calculator { public static double DoOperation(double num1, double num2, string op) { double result = double.NaN; // Default value is "not-a-number" if an operation, such as division, could result in an error. // Use a switch statement to do the math. switch (op) { case "a": result = num1 + num2; break; case "s": result = num1 - num2; break; case "m": result = num1 * num2; break; case "d": // Ask the user to enter a non-zero divisor. if (num2 != 0) { result = num1 / num2; } break; // Return text for an incorrect option entry. default: break; } return result; } } }
Program.cs juga memiliki referensi, tetapi kesalahan mengatakan
Calculator.DoOperation
panggilan tidak teratasi. Kesalahan ini karenaCalculatorLibrary
berada di namespace yang berbeda. Untuk referensi yang memenuhi syarat sepenuhnya, Anda dapat menambahkan namespaceCalculatorLibrary
ke panggilanCalculator.DoOperation
:result = CalculatorLibrary.Calculator.DoOperation(cleanNum1, cleanNum2, op);
Atau, Anda dapat mencoba menambahkan petunjuk
using
ke awal file:using CalculatorLibrary;
Menambahkan
using
seharusnya memungkinkan Anda menghapus namespaceCalculatorLibrary
dari situs panggilan, tetapi sekarang ada ambiguitas. Apakah kelasCalculator
di dalamCalculatorLibrary
, atau merupakan namespaceCalculator
?Untuk memperbaiki ambiguitas ini, ganti nama namespace dari
Calculator
keCalculatorProgram
di Program.cs.namespace CalculatorProgram
Pada Penjelajah Solusi, klik kanan node solusi dan pilih Tambahkan>Proyek Baru.
Di jendela Tambahkan proyek baru, ketik pustaka kelas di kotak Pencarian. Pilih pola dasar proyek Pustaka kelas C#, lalu pilih Berikutnya.
Pada layar Konfigurasikan proyek baru Anda, ketik nama proyek CalculatorLibrary, lalu pilih Berikutnya.
Pada layar Informasi tambahan, .NET 8.0 dipilih. Pilih Buat.
Visual Studio membuat proyek baru dan menambahkannya ke solusi.
Ganti nama file Class1.cs menjadi CalculatorLibrary.cs. Untuk mengganti nama file, Anda bisa mengklik kanan nama di Penjelajah Solusi dan memilih Ganti Nama, pilih nama dan tekan F2, atau pilih nama dan pilih lagi untuk mengetik.
Pesan mungkin menanyakan apakah Anda ingin mengganti nama semua referensi ke
Class1
dalam file. Anda dapat menjawab sesukanya karena Anda akan mengganti kode di langkah berikutnya.Sekarang, tambahkan referensi proyek agar proyek pertama dapat menggunakan API yang diekspos oleh pustaka kelas baru. Klik kanan node Dependensi pada proyek Kalkulator dan pilih Tambahkan Referensi Proyek.
Kotak dialog Manajer Referensi muncul. Dalam kotak dialog ini, Anda dapat menambahkan referensi ke proyek, rakitan, dan COM DLL lainnya yang dibutuhkan oleh proyek Anda.
Dalam kotak dialog Pengelola Referensi, pilih kotak centang untuk proyek CalculatorLibrary, lalu pilih Oke.
Referensi proyek muncul di node Proyek pada Penjelajah Solusi.
Pada Program.cs, pilih kelas
Calculator
dan semua kodenya, lalu tekan Ctrl+X untuk memotongnya. Kemudian, di CalculatorLibrary.cs, tempelkan kodenya ke namespaceCalculatorLibrary
.Selain itu, tambahkan
public
sebelum kelas Calculator untuk mengeksposnya di luar pustaka.CalculatorLibrary.cs seharusnya menyerupai kode berikut:
namespace CalculatorLibrary { public class Calculator { public static double DoOperation(double num1, double num2, string op) { double result = double.NaN; // Default value is "not-a-number" if an operation, such as division, could result in an error. // Use a switch statement to do the math. switch (op) { case "a": result = num1 + num2; break; case "s": result = num1 - num2; break; case "m": result = num1 * num2; break; case "d": // Ask the user to enter a non-zero divisor. if (num2 != 0) { result = num1 / num2; } break; // Return text for an incorrect option entry. default: break; } return result; } } }
Program.cs juga memiliki referensi, tetapi kesalahan mengatakan
Calculator.DoOperation
panggilan tidak teratasi. Kesalahan ini karenaCalculatorLibrary
berada di namespace yang berbeda. Untuk referensi yang memenuhi syarat sepenuhnya, Anda dapat menambahkan namespaceCalculatorLibrary
ke panggilanCalculator.DoOperation
:result = CalculatorLibrary.Calculator.DoOperation(cleanNum1, cleanNum2, op);
Atau, Anda dapat mencoba menambahkan petunjuk
using
ke awal file:using CalculatorLibrary;
Menambahkan
using
seharusnya memungkinkan Anda menghapus namespaceCalculatorLibrary
dari situs panggilan, tetapi sekarang ada ambiguitas. Apakah kelasCalculator
di dalamCalculatorLibrary
, atau merupakan namespaceCalculator
?Untuk memperbaiki ambiguitas ini, ganti nama namespace dari
Calculator
keCalculatorProgram
di Program.cs.namespace CalculatorProgram
Mereferensikan pustaka .NET: Menulis ke log
Anda dapat menggunakan kelas .NET Trace untuk menambahkan log dari semua operasi, dan menulisnya ke file teks. Kelas Trace
ini juga bermanfaat untuk teknik penelusuran kesalahan cetak dasar. Kelas Trace
berada di System.Diagnostics
, dan menggunakan kelas System.IO
seperti StreamWriter
.
Mulailah dengan menambahkan petunjuk
using
di bagian atas CalculatorLibrary.cs:using System.IO; using System.Diagnostics;
Penggunaan kelas
Trace
ini harus berpegang pada referensi untuk kelas tersebut, yang terkait dengan aliran file. Persyaratan itu berarti kalkulator bekerja lebih baik sebagai objek, jadi tambahkan konstruktor di awal kelasCalculator
pada CalculatorLibrary.cs.Selain itu, hapus kata kunci
static
untuk mengubah metodeDoOperation
statik menjadi metode anggota.public Calculator() { StreamWriter logFile = File.CreateText("calculator.log"); Trace.Listeners.Add(new TextWriterTraceListener(logFile)); Trace.AutoFlush = true; Trace.WriteLine("Starting Calculator Log"); Trace.WriteLine(String.Format("Started {0}", System.DateTime.Now.ToString())); } public double DoOperation(double num1, double num2, string op) {
Tambahkan output log ke setiap kalkulasi.
DoOperation
seharusnya terlihat seperti kode berikut:public double DoOperation(double num1, double num2, string op) { double result = double.NaN; // Default value is "not-a-number" if an operation, such as division, could result in an error. // Use a switch statement to do the math. switch (op) { case "a": result = num1 + num2; Trace.WriteLine(String.Format("{0} + {1} = {2}", num1, num2, result)); break; case "s": result = num1 - num2; Trace.WriteLine(String.Format("{0} - {1} = {2}", num1, num2, result)); break; case "m": result = num1 * num2; Trace.WriteLine(String.Format("{0} * {1} = {2}", num1, num2, result)); break; case "d": // Ask the user to enter a non-zero divisor. if (num2 != 0) { result = num1 / num2; Trace.WriteLine(String.Format("{0} / {1} = {2}", num1, num2, result)); } break; // Return text for an incorrect option entry. default: break; } return result; }
Kembali ke Program.cs, sebuah garis bawah berlekuk merah sekarang menandai panggilan statik. Untuk memperbaiki kesalahan, buat variabel
calculator
dengan menambahkan baris kode berikut tepat sebelum perulanganwhile (!endApp)
:Calculator calculator = new Calculator();
Selain itu, ubah situs panggilan
DoOperation
untuk mereferensikan objek bernamacalculator
dalam huruf kecil. Sekarang kode menjadi invokasi anggota, bukan panggilan ke metode statik.result = calculator.DoOperation(cleanNum1, cleanNum2, op);
Jalankan aplikasi lagi. Setelah selesai, klik kanan node proyek Kalkulator dan pilih Buka Folder di File Explorer.
Di File Explorer, navigasikan ke folder output di bin/Debug/, dan buka file calculator.log. Outputnya akan terlihat seperti ini:
Starting Calculator Log Started 7/9/2020 1:58:19 PM 1 + 2 = 3 3 * 3 = 9
Pada titik ini, CalculatorLibrary.cs harus menyerupai kode ini:
using System;
using System.IO;
using System.Diagnostics;
namespace CalculatorLibrary
{
public class Calculator
{
public Calculator()
{
StreamWriter logFile = File.CreateText("calculator.log");
Trace.Listeners.Add(new TextWriterTraceListener(logFile));
Trace.AutoFlush = true;
Trace.WriteLine("Starting Calculator Log");
Trace.WriteLine(String.Format("Started {0}", System.DateTime.Now.ToString()));
}
public double DoOperation(double num1, double num2, string op)
{
double result = double.NaN; // Default value is "not-a-number" if an operation, such as division, could result in an error.
// Use a switch statement to do the math.
switch (op)
{
case "a":
result = num1 + num2;
Trace.WriteLine(String.Format("{0} + {1} = {2}", num1, num2, result));
break;
case "s":
result = num1 - num2;
Trace.WriteLine(String.Format("{0} - {1} = {2}", num1, num2, result));
break;
case "m":
result = num1 * num2;
Trace.WriteLine(String.Format("{0} * {1} = {2}", num1, num2, result));
break;
case "d":
// Ask the user to enter a non-zero divisor.
if (num2 != 0)
{
result = num1 / num2;
Trace.WriteLine(String.Format("{0} / {1} = {2}", num1, num2, result));
}
break;
// Return text for an incorrect option entry.
default:
break;
}
return result;
}
}
}
Program.cs seharusnya terlihat seperti kode berikut:
using System;
using CalculatorLibrary;
namespace CalculatorProgram
{
class Program
{
static void Main(string[] args)
{
bool endApp = false;
// Display title as the C# console calculator app.
Console.WriteLine("Console Calculator in C#\r");
Console.WriteLine("------------------------\n");
Calculator calculator = new Calculator();
while (!endApp)
{
// Declare variables and set to empty.
string numInput1 = "";
string numInput2 = "";
double result = 0;
// Ask the user to type the first number.
Console.Write("Type a number, and then press Enter: ");
numInput1 = Console.ReadLine();
double cleanNum1 = 0;
while (!double.TryParse(numInput1, out cleanNum1))
{
Console.Write("This is not valid input. Please enter an integer value: ");
numInput1 = Console.ReadLine();
}
// Ask the user to type the second number.
Console.Write("Type another number, and then press Enter: ");
numInput2 = Console.ReadLine();
double cleanNum2 = 0;
while (!double.TryParse(numInput2, out cleanNum2))
{
Console.Write("This is not valid input. Please enter an integer value: ");
numInput2 = Console.ReadLine();
}
// Ask the user to choose an operator.
Console.WriteLine("Choose an operator from the following list:");
Console.WriteLine("\ta - Add");
Console.WriteLine("\ts - Subtract");
Console.WriteLine("\tm - Multiply");
Console.WriteLine("\td - Divide");
Console.Write("Your option? ");
string op = Console.ReadLine();
try
{
result = calculator.DoOperation(cleanNum1, cleanNum2, op);
if (double.IsNaN(result))
{
Console.WriteLine("This operation will result in a mathematical error.\n");
}
else Console.WriteLine("Your result: {0:0.##}\n", result);
}
catch (Exception e)
{
Console.WriteLine("Oh no! An exception occurred trying to do the math.\n - Details: " + e.Message);
}
Console.WriteLine("------------------------\n");
// Wait for the user to respond before closing.
Console.Write("Press 'n' and Enter to close the app, or press any other key and Enter to continue: ");
if (Console.ReadLine() == "n") endApp = true;
Console.WriteLine("\n"); // Friendly linespacing.
}
return;
}
}
}
Anda dapat menggunakan kelas .NET Trace untuk menambahkan log dari semua operasi, dan menulisnya ke file teks. Kelas Trace
ini juga bermanfaat untuk teknik penelusuran kesalahan cetak dasar. Kelas Trace
berada di System.Diagnostics
, dan menggunakan kelas System.IO
seperti StreamWriter
.
Mulailah dengan menambahkan petunjuk
using
di bagian atas CalculatorLibrary.cs:using System.Diagnostics;
Penggunaan kelas
Trace
ini harus berpegang pada referensi untuk kelas tersebut, yang terkait dengan aliran file. Persyaratan itu berarti kalkulator bekerja lebih baik sebagai objek, jadi tambahkan konstruktor di awal kelasCalculator
pada CalculatorLibrary.cs.Selain itu, hapus kata kunci
static
untuk mengubah metodeDoOperation
statik menjadi metode anggota.public Calculator() { StreamWriter logFile = File.CreateText("calculator.log"); Trace.Listeners.Add(new TextWriterTraceListener(logFile)); Trace.AutoFlush = true; Trace.WriteLine("Starting Calculator Log"); Trace.WriteLine(String.Format("Started {0}", System.DateTime.Now.ToString())); } public double DoOperation(double num1, double num2, string op) {
Tambahkan output log ke setiap kalkulasi.
DoOperation
seharusnya terlihat seperti kode berikut:public double DoOperation(double num1, double num2, string op) { double result = double.NaN; // Default value is "not-a-number" if an operation, such as division, could result in an error. // Use a switch statement to do the math. switch (op) { case "a": result = num1 + num2; Trace.WriteLine(String.Format("{0} + {1} = {2}", num1, num2, result)); break; case "s": result = num1 - num2; Trace.WriteLine(String.Format("{0} - {1} = {2}", num1, num2, result)); break; case "m": result = num1 * num2; Trace.WriteLine(String.Format("{0} * {1} = {2}", num1, num2, result)); break; case "d": // Ask the user to enter a non-zero divisor. if (num2 != 0) { result = num1 / num2; Trace.WriteLine(String.Format("{0} / {1} = {2}", num1, num2, result)); } break; // Return text for an incorrect option entry. default: break; } return result; }
Kembali ke Program.cs, sebuah garis bawah berlekuk merah sekarang menandai panggilan statik. Untuk memperbaiki kesalahan, buat variabel
calculator
dengan menambahkan baris kode berikut tepat sebelum perulanganwhile (!endApp)
:Calculator calculator = new Calculator();
Selain itu, ubah situs panggilan
DoOperation
untuk mereferensikan objek bernamacalculator
dalam huruf kecil. Sekarang kode menjadi invokasi anggota, bukan panggilan ke metode statik.result = calculator.DoOperation(cleanNum1, cleanNum2, op);
Jalankan aplikasi lagi. Setelah selesai, klik kanan node proyek Kalkulator dan pilih Buka Folder di File Explorer.
Di File Explorer, navigasikan ke folder output di bin/Debug/, dan buka file calculator.log. Outputnya akan terlihat seperti ini:
Starting Calculator Log Started 7/9/2020 1:58:19 PM 1 + 2 = 3 3 * 3 = 9
Pada titik ini, CalculatorLibrary.cs harus menyerupai kode ini:
using System.Diagnostics;
namespace CalculatorLibrary
{
public class Calculator
{
public Calculator()
{
StreamWriter logFile = File.CreateText("calculator.log");
Trace.Listeners.Add(new TextWriterTraceListener(logFile));
Trace.AutoFlush = true;
Trace.WriteLine("Starting Calculator Log");
Trace.WriteLine(String.Format("Started {0}", System.DateTime.Now.ToString()));
}
public double DoOperation(double num1, double num2, string op)
{
double result = double.NaN; // Default value is "not-a-number" if an operation, such as division, could result in an error.
// Use a switch statement to do the math.
switch (op)
{
case "a":
result = num1 + num2;
Trace.WriteLine(String.Format("{0} + {1} = {2}", num1, num2, result));
break;
case "s":
result = num1 - num2;
Trace.WriteLine(String.Format("{0} - {1} = {2}", num1, num2, result));
break;
case "m":
result = num1 * num2;
Trace.WriteLine(String.Format("{0} * {1} = {2}", num1, num2, result));
break;
case "d":
// Ask the user to enter a non-zero divisor.
if (num2 != 0)
{
result = num1 / num2;
Trace.WriteLine(String.Format("{0} / {1} = {2}", num1, num2, result));
}
break;
// Return text for an incorrect option entry.
default:
break;
}
return result;
}
}
}
Program.cs seharusnya terlihat seperti kode berikut:
using CalculatorLibrary;
namespace CalculatorProgram
{
class Program
{
static void Main(string[] args)
{
bool endApp = false;
// Display title as the C# console calculator app.
Console.WriteLine("Console Calculator in C#\r");
Console.WriteLine("------------------------\n");
Calculator calculator = new Calculator();
while (!endApp)
{
// Declare variables and set to empty.
string numInput1 = "";
string numInput2 = "";
double result = 0;
// Ask the user to type the first number.
Console.Write("Type a number, and then press Enter: ");
numInput1 = Console.ReadLine();
double cleanNum1 = 0;
while (!double.TryParse(numInput1, out cleanNum1))
{
Console.Write("This is not valid input. Please enter an integer value: ");
numInput1 = Console.ReadLine();
}
// Ask the user to type the second number.
Console.Write("Type another number, and then press Enter: ");
numInput2 = Console.ReadLine();
double cleanNum2 = 0;
while (!double.TryParse(numInput2, out cleanNum2))
{
Console.Write("This is not valid input. Please enter an integer value: ");
numInput2 = Console.ReadLine();
}
// Ask the user to choose an operator.
Console.WriteLine("Choose an operator from the following list:");
Console.WriteLine("\ta - Add");
Console.WriteLine("\ts - Subtract");
Console.WriteLine("\tm - Multiply");
Console.WriteLine("\td - Divide");
Console.Write("Your option? ");
string op = Console.ReadLine();
try
{
result = calculator.DoOperation(cleanNum1, cleanNum2, op);
if (double.IsNaN(result))
{
Console.WriteLine("This operation will result in a mathematical error.\n");
}
else Console.WriteLine("Your result: {0:0.##}\n", result);
}
catch (Exception e)
{
Console.WriteLine("Oh no! An exception occurred trying to do the math.\n - Details: " + e.Message);
}
Console.WriteLine("------------------------\n");
// Wait for the user to respond before closing.
Console.Write("Press 'n' and Enter to close the app, or press any other key and Enter to continue: ");
if (Console.ReadLine() == "n") endApp = true;
Console.WriteLine("\n"); // Friendly linespacing.
}
return;
}
}
}
Menambahkan Paket NuGet: Menulis ke file JSON
Untuk operasi output di JSON, sebuah format populer dan portabel untuk menyimpan data objek, Anda dapat mereferensikan paket Newtonsoft.Json NuGet. Paket NuGet adalah metode distribusi primer untuk pustaka kelas .NET.
Di Penjelajah Solusi, klik kanan node Dependensi untuk proyek CalculatorLibrary, dan pilih Kelola Paket NuGet.
Pengelola Paket NuGet terbuka.
Cari dan pilih paket Newtonsoft.Json, dan pilih Instal.
Visual Studio mengunduh paket tersebut dan menambahkannya ke proyek. Entri baru muncul di node Referensi dalam Penjelajah Solusi.
Jika Anda diminta untuk menerima perubahan, pilih OK.
Visual Studio mengunduh paket tersebut dan menambahkannya ke proyek. Entri baru muncul di node Paket dalam Penjelajah Solusi.
Tambahkan petunjuk
using
untukNewtonsoft.Json
di awal CalculatorLibrary.cs.using Newtonsoft.Json;
Buat objek anggota
JsonWriter
lalu ganti konstruktorCalculator
dengan kode berikut:JsonWriter writer; public Calculator() { StreamWriter logFile = File.CreateText("calculatorlog.json"); logFile.AutoFlush = true; writer = new JsonTextWriter(logFile); writer.Formatting = Formatting.Indented; writer.WriteStartObject(); writer.WritePropertyName("Operations"); writer.WriteStartArray(); }
Ubah metode
DoOperation
untuk menambahkan kode JSONwriter
:public double DoOperation(double num1, double num2, string op) { double result = double.NaN; // Default value is "not-a-number" if an operation, such as division, could result in an error. writer.WriteStartObject(); writer.WritePropertyName("Operand1"); writer.WriteValue(num1); writer.WritePropertyName("Operand2"); writer.WriteValue(num2); writer.WritePropertyName("Operation"); // Use a switch statement to do the math. switch (op) { case "a": result = num1 + num2; writer.WriteValue("Add"); break; case "s": result = num1 - num2; writer.WriteValue("Subtract"); break; case "m": result = num1 * num2; writer.WriteValue("Multiply"); break; case "d": // Ask the user to enter a non-zero divisor. if (num2 != 0) { result = num1 / num2; } writer.WriteValue("Divide"); break; // Return text for an incorrect option entry. default: break; } writer.WritePropertyName("Result"); writer.WriteValue(result); writer.WriteEndObject(); return result; }
Tambahkan metode untuk menyelesaikan sintaksis JSON setelah pengguna selesai memasukkan data operasi.
public void Finish() { writer.WriteEndArray(); writer.WriteEndObject(); writer.Close(); }
Pada bagian akhir Program.cs, sebelum
return;
, tambahkan panggilan keFinish
:// Add call to close the JSON writer before return calculator.Finish(); return; }
Bangun dan jalankan aplikasi, dan setelah Anda selesai memasukkan beberapa operasi, tutup aplikasi dengan memasukkan perintah n.
Buka file calculatorlog.json di File Explorer. Anda akan melihat sesuatu seperti konten berikut:
{ "Operations": [ { "Operand1": 2.0, "Operand2": 3.0, "Operation": "Add", "Result": 5.0 }, { "Operand1": 3.0, "Operand2": 4.0, "Operation": "Multiply", "Result": 12.0 } ] }
Men-debug: Mengatur dan mencapai titik henti
Debugger Visual Studio adalah alat yang kuat. Debugger dapat menelusuri kode Anda untuk menemukan titik yang tepat di mana kesalahan pemrograman terjadi. Kemudian, Anda dapat memahami koreksi apa yang perlu Anda lakukan, dan membuat perubahan sementara agar Anda dapat terus menjalankan aplikasi Anda.
Dalam Program.cs, klik pada gutter di sebelah kiri baris kode berikut. Anda juga dapat mengeklik baris tersebut dan memilih F9, atau klik kanan baris dan pilih Titik Henti>Sisipkan Titik Henti.
result = calculator.DoOperation(cleanNum1, cleanNum2, op);
Titik merah yang tampil mengindikasikan titik henti. Anda dapat menggunakan titik henti untuk menjeda aplikasi dan memeriksa kode. Anda dapat menentukan titik henti pada baris kode yang dapat dijalankan mana pun.
Buat dan jalankan aplikasi. Masukkan nilai berikut untuk kalkulasi:
- Untuk nomor pertama, masukkan angka 8.
- Untuk nomor kedua, masukkan angka 0.
- Untuk operator, ayo kita bersenang-senang. Masukkan d.
Aplikasi menangguhkan tempat Anda membuat titik henti, yang ditandai oleh penunjuk kuning di sebelah kiri dan kode yang disorot. Kode yang disorot belum dijalankan.
Sekarang, dengan aplikasi yang ditangguhkan, Anda dapat memeriksa status aplikasi Anda.
Men-debug: Melihat variabel
Di kode yang disorot, arahkan kursor ke variabel seperti
cleanNum1
danop
. Nilai saat ini untuk variabel tersebut,8
dand
muncul berurutan di DataTips.Saat melakukan penelusuran kesalahan, Anda sering kali harus memeriksa apakah variabel memiliki nilai yang Anda harapkan untuk memperbaiki masalah.
Di panel bawah, lihat jendela Lokal. Jika tertutup, pilih Debug>Windows>Lokal untuk membukanya.
Jendela Lokal menunjukkan setiap variabel yang saat ini berada dalam cakupan, beserta nilai dan jenisnya.
Lihat jendela Otomatis.
Jendela Otomatis mirip dengan jendela Lokal, tetapi jendela ini menampilkan variabel secara langsung yang mendahului dan mengikuti baris kode saat ini di mana aplikasi Anda dijeda.
Catatan
Jika Anda tidak melihat jendela Otomatis, pilih Debug>Windows>Autos untuk membukanya.
Selanjutnya, jalankan kode dalam pernyataan debugger satu per satu, yang disebut sebagai langkah.
Men-debug: Menelusuri kode
Tekan F11, atau pilih Debug>Masuk.
Dengan menggunakan perintah Masuk, aplikasi menjalankan pernyataan saat ini dan berlanjut ke pernyataan yang dapat dieksekusi berikutnya, biasanya baris kode berikutnya. Penunjuk kuning di sebelah kiri selalu mengindikasikan pernyataan saat ini.
Anda baru saja masuk ke metode
DoOperation
di kelasCalculator
.Untuk mendapatkan tampilan hierarkis pada alur program Anda, lihat jendela Tumpukan Panggilan. Jika tertutup, pilih Debug>Windows>Tumpukan Panggilan untuk membukanya.
Tampilan ini menunjukkan metode
Calculator.DoOperation
saat ini, yang ditandai dengan penunjuk kuning. Baris kedua menunjukkan fungsi yang memanggil metode tersebut, dari metodeMain
pada Program.cs.Jendela Tumpukan Panggilan menunjukkan urutan metode dan fungsi yang dipanggil. Jendela ini juga menyediakan akses ke banyak fitur debugger, seperti Buka Kode Sumber, dari menu pintasannya.
Tekan F10, atau pilih Debug>Lewati beberapa kali hingga aplikasi berhenti pada pernyataan
switch
.switch (op) {
Perintah Lewati mirip dengan perintah Masuk, kecuali jika pernyataan saat ini memanggil fungsi, debugger akan menjalankan kode dalam fungsi, dan tidak menangguhkan eksekusi hingga fungsi kembali. Lewati lebih cepat daripada Masuk jika Anda tidak tertarik dengan fungsi tertentu.
Tekan F10 sekali lagi hingga aplikasi berhenti pada baris kode berikut.
if (num2 != 0) {
Kode ini memeriksa kasus pembagian dengan nol. Jika aplikasi berlanjut, aplikasi akan melemparkan pengecualian umum (kesalahan), tetapi Anda mungkin ingin mencoba hal lain, seperti melihat nilai aktual yang dikembalikan di konsol. Salah satu pilihannya adalah menggunakan fitur debugger yang disebut edit-dan-lanjutkan untuk membuat perubahan pada kode lalu melanjutkan penelusuran kesalahan. Namun, ada trik yang lain untuk mengubah alur eksekusi untuk sementara.
Men-debug: Menguji perubahan sementara
Pilih penunjuk kuning, yang saat ini berhenti pada pernyataan
if (num2 != 0)
, dan seret ke pernyataan berikut:result = num1 / num2;
Menyeret penunjuk ke sini menyebabkan aplikasi sepenuhnya melompati pernyataan
if
, sehingga Anda dapat melihat apa yang terjadi ketika Anda membagi dengan nol.Tekan F10 untuk menjalankan baris kode.
Jika Anda mengarahkan mouse ke atas variabel
result
, nilai Tak Terbatas akan ditunjukkan. Dalam C#, Tak Terbatas adalah hasil saat Anda membagi dengan nol.Tekan F5, atau pilih Debug>Lanjutkan Penelusuran kesalahan.
Simbol tak terbatas muncul di konsol karena hasil dari operasi matematika.
Tutup aplikasi secara benar dengan memasukkan perintah n.
Kode selesai
Berikut adalah kode lengkap untuk file CalculatorLibrary.cs, setelah Anda menyelesaikan semua langkahnya:
using System;
using System.IO;
using Newtonsoft.Json;
namespace CalculatorLibrary
{
public class Calculator
{
JsonWriter writer;
public Calculator()
{
StreamWriter logFile = File.CreateText("calculatorlog.json");
logFile.AutoFlush = true;
writer = new JsonTextWriter(logFile);
writer.Formatting = Formatting.Indented;
writer.WriteStartObject();
writer.WritePropertyName("Operations");
writer.WriteStartArray();
}
public double DoOperation(double num1, double num2, string op)
{
double result = double.NaN; // Default value is "not-a-number" if an operation, such as division, could result in an error.
writer.WriteStartObject();
writer.WritePropertyName("Operand1");
writer.WriteValue(num1);
writer.WritePropertyName("Operand2");
writer.WriteValue(num2);
writer.WritePropertyName("Operation");
// Use a switch statement to do the math.
switch (op)
{
case "a":
result = num1 + num2;
writer.WriteValue("Add");
break;
case "s":
result = num1 - num2;
writer.WriteValue("Subtract");
break;
case "m":
result = num1 * num2;
writer.WriteValue("Multiply");
break;
case "d":
// Ask the user to enter a non-zero divisor.
if (num2 != 0)
{
result = num1 / num2;
}
writer.WriteValue("Divide");
break;
// Return text for an incorrect option entry.
default:
break;
}
writer.WritePropertyName("Result");
writer.WriteValue(result);
writer.WriteEndObject();
return result;
}
public void Finish()
{
writer.WriteEndArray();
writer.WriteEndObject();
writer.Close();
}
}
}
Dan ini adalah kode untuk Program.cs:
using System;
using CalculatorLibrary;
namespace CalculatorProgram
{
class Program
{
static void Main(string[] args)
{
bool endApp = false;
// Display title as the C# console calculator app.
Console.WriteLine("Console Calculator in C#\r");
Console.WriteLine("------------------------\n");
Calculator calculator = new Calculator();
while (!endApp)
{
// Declare variables and set to empty.
string numInput1 = "";
string numInput2 = "";
double result = 0;
// Ask the user to type the first number.
Console.Write("Type a number, and then press Enter: ");
numInput1 = Console.ReadLine();
double cleanNum1 = 0;
while (!double.TryParse(numInput1, out cleanNum1))
{
Console.Write("This is not valid input. Please enter an integer value: ");
numInput1 = Console.ReadLine();
}
// Ask the user to type the second number.
Console.Write("Type another number, and then press Enter: ");
numInput2 = Console.ReadLine();
double cleanNum2 = 0;
while (!double.TryParse(numInput2, out cleanNum2))
{
Console.Write("This is not valid input. Please enter an integer value: ");
numInput2 = Console.ReadLine();
}
// Ask the user to choose an operator.
Console.WriteLine("Choose an operator from the following list:");
Console.WriteLine("\ta - Add");
Console.WriteLine("\ts - Subtract");
Console.WriteLine("\tm - Multiply");
Console.WriteLine("\td - Divide");
Console.Write("Your option? ");
string op = Console.ReadLine();
try
{
result = calculator.DoOperation(cleanNum1, cleanNum2, op);
if (double.IsNaN(result))
{
Console.WriteLine("This operation will result in a mathematical error.\n");
}
else Console.WriteLine("Your result: {0:0.##}\n", result);
}
catch (Exception e)
{
Console.WriteLine("Oh no! An exception occurred trying to do the math.\n - Details: " + e.Message);
}
Console.WriteLine("------------------------\n");
// Wait for the user to respond before closing.
Console.Write("Press 'n' and Enter to close the app, or press any other key and Enter to continue: ");
if (Console.ReadLine() == "n") endApp = true;
Console.WriteLine("\n"); // Friendly linespacing.
}
calculator.Finish();
return;
}
}
}
Berikut adalah kode lengkap untuk file CalculatorLibrary.cs, setelah Anda menyelesaikan semua langkahnya:
using Newtonsoft.Json;
namespace CalculatorLibrary
{
public class Calculator
{
JsonWriter writer;
public Calculator()
{
StreamWriter logFile = File.CreateText("calculatorlog.json");
logFile.AutoFlush = true;
writer = new JsonTextWriter(logFile);
writer.Formatting = Formatting.Indented;
writer.WriteStartObject();
writer.WritePropertyName("Operations");
writer.WriteStartArray();
}
public double DoOperation(double num1, double num2, string op)
{
double result = double.NaN; // Default value is "not-a-number" if an operation, such as division, could result in an error.
writer.WriteStartObject();
writer.WritePropertyName("Operand1");
writer.WriteValue(num1);
writer.WritePropertyName("Operand2");
writer.WriteValue(num2);
writer.WritePropertyName("Operation");
// Use a switch statement to do the math.
switch (op)
{
case "a":
result = num1 + num2;
writer.WriteValue("Add");
break;
case "s":
result = num1 - num2;
writer.WriteValue("Subtract");
break;
case "m":
result = num1 * num2;
writer.WriteValue("Multiply");
break;
case "d":
// Ask the user to enter a non-zero divisor.
if (num2 != 0)
{
result = num1 / num2;
}
writer.WriteValue("Divide");
break;
// Return text for an incorrect option entry.
default:
break;
}
writer.WritePropertyName("Result");
writer.WriteValue(result);
writer.WriteEndObject();
return result;
}
public void Finish()
{
writer.WriteEndArray();
writer.WriteEndObject();
writer.Close();
}
}
}
Dan ini adalah kode untuk Program.cs:
using CalculatorLibrary;
namespace CalculatorProgram
{
class Program
{
static void Main(string[] args)
{
bool endApp = false;
// Display title as the C# console calculator app.
Console.WriteLine("Console Calculator in C#\r");
Console.WriteLine("------------------------\n");
Calculator calculator = new Calculator();
while (!endApp)
{
// Declare variables and set to empty.
string numInput1 = "";
string numInput2 = "";
double result = 0;
// Ask the user to type the first number.
Console.Write("Type a number, and then press Enter: ");
numInput1 = Console.ReadLine();
double cleanNum1 = 0;
while (!double.TryParse(numInput1, out cleanNum1))
{
Console.Write("This is not valid input. Please enter an integer value: ");
numInput1 = Console.ReadLine();
}
// Ask the user to type the second number.
Console.Write("Type another number, and then press Enter: ");
numInput2 = Console.ReadLine();
double cleanNum2 = 0;
while (!double.TryParse(numInput2, out cleanNum2))
{
Console.Write("This is not valid input. Please enter an integer value: ");
numInput2 = Console.ReadLine();
}
// Ask the user to choose an operator.
Console.WriteLine("Choose an operator from the following list:");
Console.WriteLine("\ta - Add");
Console.WriteLine("\ts - Subtract");
Console.WriteLine("\tm - Multiply");
Console.WriteLine("\td - Divide");
Console.Write("Your option? ");
string op = Console.ReadLine();
try
{
result = calculator.DoOperation(cleanNum1, cleanNum2, op);
if (double.IsNaN(result))
{
Console.WriteLine("This operation will result in a mathematical error.\n");
}
else Console.WriteLine("Your result: {0:0.##}\n", result);
}
catch (Exception e)
{
Console.WriteLine("Oh no! An exception occurred trying to do the math.\n - Details: " + e.Message);
}
Console.WriteLine("------------------------\n");
// Wait for the user to respond before closing.
Console.Write("Press 'n' and Enter to close the app, or press any other key and Enter to continue: ");
if (Console.ReadLine() == "n") endApp = true;
Console.WriteLine("\n"); // Friendly linespacing.
}
calculator.Finish();
return;
}
}
}
Langkah berikutnya
Selamat atas penyelesaian tutorial ini! Untuk mempelajari lebih lanjut, lanjutkan dengan konten berikut:
- Lanjutkan dengan tutorial C# lainnya
- Mulai cepat: Membuat aplikasi web ASP.NET Core
- Pelajari cara men-debug kode C# di Visual Studio
- Menelusuri cara membuat dan menjalankan pengujian unit
- Menjalankan program C#
- Pelajari tentang C# IntelliSense
- Lanjutkan dengan gambaran umum Visual Studio IDE
- Pembuatan log dan pelacakan