Bagikan melalui


Tutorial: Memperluas aplikasi konsol C# dan men-debug di Visual Studio (bagian 2 dari 2)

Di bagian 2 dari seri tutorial ini, Anda menyelami sedikit lebih dalam fitur build dan debug Visual Studio yang Anda butuhkan untuk pengembangan harian. Fitur-fitur ini termasuk mengelola beberapa proyek, debugging, dan mengacu pada paket pihak ketiga. Anda menjalankan aplikasi konsol C# yang Anda buat di Bagian 1 dari tutorial ini, dan menjelajahi beberapa fitur lingkungan pengembangan terintegrasi Visual Studio (IDE). Tutorial ini adalah bagian 2 dari seri tutorial dua bagian.

Dalam tutorial ini, Anda menyelesaikan tugas-tugas berikut:

  • Tambahkan proyek kedua.
  • Pustaka referensi dan tambahkan paket.
  • Debug kode Anda.
  • Periksa kode lengkap Anda.

Prasyarat

Untuk mengerjakan artikel ini, Anda dapat menggunakan salah satu aplikasi kalkulator ini:

Menambahkan proyek lain

Kode dunia nyata melibatkan proyek yang bekerja sama dalam solusi. Anda dapat menambahkan proyek pustaka kelas ke aplikasi kalkulator yang menyediakan beberapa fungsi kalkulator.

Di Visual Studio, Anda menggunakan perintah menu File>Tambahkan>Proyek Baru untuk menambahkan proyek baru. Anda juga dapat mengklik kanan solusi di Solution Explorer untuk menambahkan proyek dari menu konteks.

  1. Di Penjelajah Solusi, klik kanan simpul solusi dan pilih Tambahkan>Proyek Baru.

  2. Di jendela Tambahkan proyek baru, ketik pustaka kelas di kotak pencarian. Pilih templat proyek pustaka kelas C# , lalu pilih Berikutnya.

    Cuplikan layar pemilihan templat proyek Pustaka Kelas.

  3. Pada layar Mengonfigurasi proyek baru Anda, ketik nama proyek CalculatorLibrary, lalu pilih Berikutnya.

  4. Pilih .NET 3.1 saat diminta. Visual Studio membuat proyek baru dan menambahkannya ke solusi.

    Cuplikan layar Penjelajah Solusi dengan proyek pustaka kelas CalculatorLibrary ditambahkan.

  5. Ganti nama file Class1.cs menjadi CalculatorLibrary.cs. Untuk mengganti nama file, Anda dapat 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 referensi menjadi Class1 dalam file. Tidak masalah bagaimana Anda menjawab, karena Anda akan mengganti kode di langkah mendatang.

  6. Sekarang tambahkan referensi proyek, sehingga proyek pertama dapat menggunakan API yang diekspos pustaka kelas baru. Klik kanan node Dependensi di proyek Kalkulator dan pilih Tambahkan Referensi Proyek.

    Cuplikan layar item menu Tambahkan Referensi Proyek.

    Kotak dialog Reference Manager ditampilkan. Dalam kotak dialog ini, Anda dapat menambahkan referensi ke proyek, rakitan, dan DLL COM lain yang dibutuhkan proyek Anda.

  7. Dalam kotak dialog Manajer Referensi, pilih kotak centang untuk proyek CalculatorLibrary, lalu pilih OK.

    Cuplikan layar kotak dialog Manajer Referensi.

    Referensi proyek muncul di bawah simpul Proyek di Penjelajah Solusi.

    Cuplikan layar Penjelajah Solusi dengan referensi proyek.

  8. Di Program.cs, pilih kelas Calculator dan semua kodenya, dan tekan Ctrl+X untuk memotongnya. Kemudian, di CalculatorLibrary.cs, tempelkan kode ke dalam namespace CalculatorLibrary.

    Tambahkan juga elemen kode public sebelum kelas Kalkulator untuk mengeksposnya ke luar pustaka.

    CalculatorLibrary.cs sekarang akan menyerupai kode berikut:

    // CalculatorLibrary.cs
    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;
             }
         }
     }
    
  9. Program.cs juga memiliki referensi, tetapi ada kesalahan yang menyatakan bahwa panggilan Calculator.DoOperation tidak dapat diatasi. Kesalahan ini karena CalculatorLibrary berada di namespace yang berbeda. Untuk referensi yang berkualifikasi penuh, Anda dapat menambahkan namespace CalculatorLibrary ke panggilan Calculator.DoOperation di Program.cs:

    // Program.cs
    result = CalculatorLibrary.Calculator.DoOperation(cleanNum1, cleanNum2, op);
    

    Atau, Anda dapat mencoba menambahkan direktif using ke awal file Program.cs:

    // Program.cs
    using CalculatorLibrary;
    

    Menambahkan direktif using akan memungkinkan Anda menghapus namespace CalculatorLibrary dari situs panggilan, tetapi sekarang ada ambiguitas. Apakah Calculator kelas di CalculatorLibrary, atau apakah Calculator namespace?

    Untuk mengatasi ambiguitas, ganti nama namespace dari Calculator menjadi CalculatorProgram di Program.cs.

    // Program.cs
    namespace CalculatorProgram
    
  1. Di Penjelajah Solusi, klik kanan simpul solusi dan pilih Tambahkan>Proyek Baru.

  2. Di jendela Tambahkan proyek baru, ketik pustaka kelas di kotak pencarian. Pilih templat proyek pustaka kelas C# , lalu pilih Berikutnya.

    Cuplikan layar pemilihan templat proyek Pustaka Kelas.

  3. Pada layar Mengonfigurasi proyek baru Anda, ketik nama proyek CalculatorLibrary, lalu pilih Berikutnya.

  4. Pada layar informasi tambahan, .NET 8.0 dipilih. Pilih Buat.

    Visual Studio membuat proyek baru dan menambahkannya ke solusi.

    Cuplikan layar Penjelajah Solusi dengan proyek pustaka kelas CalculatorLibrary ditambahkan.

  5. Ganti nama file Class1.cs menjadi CalculatorLibrary.cs. Untuk mengganti nama file, Anda dapat 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 menjadi Class1 dalam file. Tidak masalah bagaimana Anda menjawab, karena Anda akan mengganti kode di langkah mendatang.

  6. Sekarang tambahkan referensi proyek, sehingga proyek pertama dapat menggunakan API yang diekspos pustaka kelas baru. Klik kanan node Dependensi di proyek Kalkulator dan pilih Tambahkan Referensi Proyek.

    Cuplikan layar item menu Tambahkan Referensi Proyek.

    Kotak dialog Reference Manager ditampilkan. Dalam kotak dialog ini, Anda dapat menambahkan referensi ke proyek, rakitan, dan DLL COM lain yang dibutuhkan proyek Anda.

  7. Dalam kotak dialog Manajer Referensi, pilih kotak centang untuk proyek CalculatorLibrary, lalu pilih OK.

    Cuplikan layar kotak dialog Manajer Referensi.

    Referensi proyek muncul di bawah simpul Proyek di Penjelajah Solusi.

    Cuplikan layar Penjelajah Solusi dengan referensi proyek.

  8. Di Program.cs, pilih kelas Calculator dan semua kodenya, dan tekan Ctrl+X untuk memotongnya. Kemudian, di CalculatorLibrary.cs, tempelkan kode ke dalam namespace CalculatorLibrary.

    Tambahkan juga elemen kode public sebelum kelas Kalkulator untuk mengeksposnya ke luar pustaka.

    CalculatorLibrary.cs sekarang akan menyerupai kode berikut:

     // CalculatorLibrary.cs
     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;
             }
         }
     }
    
  9. Program.cs juga memiliki referensi, tetapi ada kesalahan yang menyatakan bahwa panggilan Calculator.DoOperation tidak dapat diatasi. Kesalahan ini karena CalculatorLibrary berada di namespace yang berbeda. Untuk referensi yang berkualifikasi penuh, Anda dapat menambahkan namespace CalculatorLibrary ke panggilan Calculator.DoOperation di Program.cs:

    // Program.cs
    result = CalculatorLibrary.Calculator.DoOperation(cleanNum1, cleanNum2, op);
    

    Atau, Anda dapat mencoba menambahkan direktif using ke awal file Program.cs:

    // Program.cs
    using CalculatorLibrary;
    

    Menambahkan direktif using akan memungkinkan Anda menghapus namespace CalculatorLibrary dari situs panggilan.

    Jika kode Program.cs Anda berada di namespace Calculator, ganti nama namespace dari Calculator menjadi CalculatorProgram untuk menghapus ambiguitas antara nama kelas dan nama namespace layanan.

Referensi perpustakaan .NET: Menulis ke catatan log

Anda dapat menggunakan kelas .NET Trace untuk menambahkan log semua operasi, dan menulisnya ke file teks. Kelas Trace juga berguna untuk teknik dasar penyelesaian masalah cetak. Kelas Trace berada di System.Diagnostics, dan menggunakan kelas System.IO seperti StreamWriter.

  1. Mulailah dengan menambahkan arahan using di bagian atas CalculatorLibrary.cs:

    // CalculatorLibrary.cs
    using System.IO;
    using System.Diagnostics;
    
  2. Penggunaan kelas Trace ini harus mempertahankan referensi untuk kelas tersebut, yang dihubungkan dengan aliran berkas. Persyaratan itu berarti kalkulator bekerja lebih baik sebagai objek, jadi tambahkan konstruktor di awal kelas Calculator di CalculatorLibrary.cs.

    Hapus juga kata kunci static untuk mengubah metode DoOperation statis menjadi metode anggota.

    // CalculatorLibrary.cs
    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)
       {
    
  3. Tambahkan output log ke setiap perhitungan. DoOperation sekarang akan terlihat seperti kode berikut:

    // CalculatorLibrary.cs
    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;
     }
    
  4. Kembali ke Program.cs, garis bawah berlekuk merah sekarang menandai panggilan statis. Untuk memperbaiki kesalahan, buat variabel calculator dengan menambahkan baris kode berikut tepat sebelum perulangan while (!endApp):

    // Program.cs
    Calculator calculator = new Calculator();
    

    Ubah juga situs panggilan DoOperation untuk mereferensikan objek bernama calculator dalam huruf kecil. Kode sekarang menjadi pemanggilan anggota, daripada panggilan ke metode statis.

    // Program.cs
    result = calculator.DoOperation(cleanNum1, cleanNum2, op);
    
  5. Jalankan aplikasi lagi. Setelah selesai, klik kanan node proyek Kalkulator dan pilih Buka Folder di File Explorer.

  6. Di File Explorer, navigasikan ke folder output di bawah bin/Debug/net8.0 (atau versi .NET apa pun yang Anda gunakan), dan buka file calculator.log. Output 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:

// CalculatorLibrary.cs
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 akan terlihat seperti kode berikut:

// 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.
            }
            return;
        }
    }
}

Anda dapat menggunakan kelas .NET Trace untuk menambahkan log semua operasi, dan menulisnya ke file teks. Kelas Trace juga berguna untuk teknik dasar penyelesaian masalah cetak. Kelas Trace berada di System.Diagnostics, dan menggunakan kelas System.IO seperti StreamWriter.

  1. Mulailah dengan menambahkan arahan using di bagian atas CalculatorLibrary.cs:

    // CalculatorLibrary.cs
    using System.Diagnostics;
    
  2. Penggunaan kelas Trace ini harus mempertahankan referensi untuk kelas tersebut, yang dihubungkan dengan aliran berkas. Persyaratan itu berarti kalkulator bekerja lebih baik sebagai objek, jadi tambahkan konstruktor di awal kelas Calculator di CalculatorLibrary.cs.

    Hapus juga kata kunci static untuk mengubah metode DoOperation statis menjadi metode anggota.

    // CalculatorLibrary.cs
    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)
       {
    
  3. Tambahkan output log ke setiap perhitungan. DoOperation sekarang akan terlihat seperti kode berikut:

    // CalculatorLibrary.cs
    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;
     }
    
  4. Kembali ke Program.cs, garis bawah berlekuk merah sekarang menandai panggilan statis. Untuk memperbaiki kesalahan, buat variabel calculator dengan menambahkan baris kode berikut tepat sebelum perulangan while (!endApp):

    // Program.cs
    Calculator calculator = new Calculator();
    

    Ubah juga situs panggilan DoOperation untuk mereferensikan objek bernama calculator dalam huruf kecil. Kode sekarang menjadi pemanggilan anggota, daripada panggilan ke metode statis.

    // Program.cs
    result = calculator.DoOperation(cleanNum1, cleanNum2, op);
    
  5. Jalankan aplikasi lagi. Setelah selesai, klik kanan node proyek Kalkulator dan pilih Buka Folder di File Explorer.

  6. Di File Explorer, navigasikan ke folder output di bawah bin/Debug/, dan buka file calculator.log. Output 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:

// CalculatorLibrary.cs
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 akan terlihat seperti kode berikut:

// 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.
                // Use Nullable types (with ?) to match type of System.Console.ReadLine
                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();

                // Validate input is not null, and matches the pattern
                if (op == null || ! Regex.IsMatch(op, "[a|s|m|d]"))
                {
                   Console.WriteLine("Error: Unrecognized input.");
                }
                else
                { 
                   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, format populer dan portabel untuk menyimpan data objek, Anda dapat mereferensikan paket Newtonsoft.Json NuGet. Paket NuGet adalah metode distribusi utama untuk pustaka kelas .NET.

  1. Di Solution Explorer, klik kanan pada node Ketergantungan untuk proyek CalculatorLibrary, dan pilih Kelola Paket NuGet.

    Cuplikan layar Kelola Paket NuGet di menu pintasan.

    Cuplikan layar Kelola Paket NuGet di menu pintasan.

    Manajer Paket NuGet terbuka.

    Cuplikan layar Manajer Paket NuGet.

  2. Cari dan pilih paket Newtonsoft.Json, dan pilih Instal.

    Cuplikan layar informasi paket NuGet Newtonsoft J SON di Manajer Paket NuGet.

    Visual Studio mengunduh paket dan menambahkannya ke proyek. Entri baru muncul di simpul Referensi di Penjelajah Solusi.

    Cuplikan layar informasi paket NuGet Newtonsoft J SON di Manajer Paket NuGet.

    Jika Anda diminta untuk menerima perubahan, pilih OK.

    Visual Studio mengunduh paket dan menambahkannya ke proyek. Entri baru muncul dalam simpul Paket di Solution Explorer.

    Tambahkan arahan using untuk Newtonsoft.Json di awal CalculatorLibrary.cs.

    // CalculatorLibrary.cs
    using Newtonsoft.Json;
    
  3. Buat objek anggota JsonWriter, dan ganti konstruktor Calculator dengan kode berikut:

         // CalculatorLibrary.cs
         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();
         }
    
  4. Ubah metode DoOperation untuk menambahkan kode writer JSON:

         // CalculatorLibrary.cs
         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;
         }
    
  5. Tambahkan metode untuk menyelesaikan sintaks JSON setelah pengguna selesai memasukkan data operasi.

     // CalculatorLibrary.cs
     public void Finish()
     {
         writer.WriteEndArray();
         writer.WriteEndObject();
         writer.Close();
     }
    
  6. Di akhir Program.cs, sebelum return;, tambahkan panggilan ke Finish:

         // Program.cs
             // Add call to close the JSON writer before return
             calculator.Finish();
             return;
         }
    
  7. Buat dan jalankan aplikasi, dan setelah selesai memasukkan beberapa operasi, tutup aplikasi dengan memasukkan perintah n.

  8. 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
         }
     ]
    }
    

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 ada kesalahan pemrograman. Anda kemudian dapat memahami koreksi apa yang perlu Anda lakukan, dan membuat perubahan sementara sehingga Anda dapat terus menjalankan aplikasi Anda.

  1. Di Program.cs, klik pada area tepi di sebelah kiri baris kode berikut. Anda juga dapat mengklik garis dan memilih F9, atau klik kanan garis dan pilih titik henti >Sisipkan Titik Henti.

    // Program.cs
    result = calculator.DoOperation(cleanNum1, cleanNum2, op);
    

    Titik merah yang muncul menunjukkan titik henti. Anda dapat menggunakan titik henti untuk menjeda aplikasi dan memeriksa kode. Anda dapat mengatur titik henti pada baris kode yang dapat dieksekusi.

    Cuplikan layar yang memperlihatkan pengaturan titik henti.

  2. Buat dan jalankan aplikasi. Masukkan nilai berikut untuk perhitungan:

    • Untuk angka pertama, masukkan 8.
    • Untuk nomor kedua, masukkan 0.
    • Kepada operator, ayo bersenang-senang. Masukkan d.

    Aplikasi berhenti sementara di tempat Anda membuat titik henti, yang ditandai oleh penunjuk kuning di sebelah kiri dan kode yang disorot. Kode yang disorot belum dijalankan.

    Cuplikan layar saat mencapai titik henti

    Sekarang, dengan aplikasi ditangguhkan, Anda dapat memeriksa status aplikasi Anda.

Debug: Lihat variabel

  1. Dalam kode yang disorot, arahkan mouse ke atas variabel seperti cleanNum1 dan op. Nilai saat ini untuk variabel ini, masing-masing 8 dan d, muncul di DataTips.

    Cuplikan layar yang memperlihatkan tampilan Tip Data.

    Saat men-debug, memeriksa apakah variabel menyimpan nilai yang Anda harapkan sering kali penting untuk memperbaiki masalah.

  2. Di panel bawah, lihat jendela Lokal. Jika ditutup, pilih Debug>Windows>Locals untuk membukanya.

    Jendela Locals menunjukkan setiap variabel yang saat ini berada dalam cakupan, bersama dengan nilai dan jenisnya.

    Cuplikan layar jendela Lokal.

    Cuplikan layar jendela Lokal.

  3. Lihat jendela Autos.

    Jendela Autos mirip dengan jendela Locals, tetapi menampilkan variabel yang langsung mendahului dan mengikuti baris kode saat ini di mana aplikasi Anda dijeda.

    Nota

    Jika Anda tidak melihat jendela Otomatis, pilih Debug>Windows>Autos untuk membukanya.

Selanjutnya, jalankan kode dalam debugger pernyataan demi pernyataan, yang disebut melangkah.

Debug: Menelusuri langkah demi langkah kode

  1. Tekan F11 , atau pilih Debug>Masuk ke.

    Dengan menggunakan perintah Langkah Ke Dalam, aplikasi menjalankan pernyataan saat ini dan melanjutkan ke pernyataan yang dapat dieksekusi berikutnya, biasanya baris kode berikutnya. Penunjuk kuning di sebelah kiri selalu menunjukkan pernyataan saat ini.

    Cuplikan layar perintah langkah ke

    Anda baru saja masuk ke metode DoOperation di kelas Calculator.

  2. Untuk melihat hierarki alur program Anda, lihat jendela Call Stack. Jika tertutup, pilih Debug>Windows>Call Stack untuk membukanya.

    Cuplikan layar tumpukan panggilan

    Tampilan ini memperlihatkan metode Calculator.DoOperation saat ini, yang ditunjukkan oleh penunjuk kuning. Baris kedua menunjukkan fungsi yang memanggil metode , dari metode Main di Program.cs.

    Jendela Call Stack menunjukkan urutan di mana metode dan fungsi dipanggil. Jendela ini juga menyediakan akses ke banyak fitur debugger, seperti Buka Kode Sumber, dari menu pintasannya.

  3. Tekan F10, atau pilih Debug>Langkah Lewati, beberapa kali hingga aplikasi berhenti pada pernyataan switch.

    // CalculatorLibrary.cs
    switch (op)
    {
    

    Perintah Step Over mirip dengan perintah Step Into, kecuali jika pernyataan saat ini memanggil fungsi, debugger menjalankan kode dalam fungsi, dan tidak menangguhkan eksekusi hingga fungsi kembali. Step Over lebih cepat daripada Step Into jika Anda tidak tertarik dengan fungsi tertentu.

  4. Tekan F10 sekali lagi, sehingga aplikasi berhenti sejenak pada baris kode berikut.

    // CalculatorLibrary.cs
    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 opsinya adalah menggunakan fitur debugger yang disebut edit-and-continue untuk membuat perubahan pada kode lalu melanjutkan debugging. Namun, ada trik yang berbeda untuk memodifikasi alur eksekusi untuk sementara waktu.

Debug: Menguji perubahan sementara

  1. Pilih penunjuk kuning, yang saat ini berhenti pada pernyataan if (num2 != 0), dan seret ke pernyataan berikutnya.

    // CalculatorLibrary.cs
    result = num1 / num2;
    

    Menyeret penunjuk di sini menyebabkan aplikasi melewati sepenuhnya pernyataan if, sehingga Anda dapat melihat apa yang terjadi ketika Anda membagi dengan nol.

  2. Tekan F10 untuk menjalankan baris kode.

  3. Jika Anda mengarahkan mouse ke atas variabel result, itu menunjukkan nilai Infinity. Di C#, Infinity adalah hasil ketika Anda membagi dengan nol.

  4. Tekan F5, atau pilih Debug>Lanjutkan Penelusuran Kesalahan.

    Simbol tak terbatas muncul di konsol sebagai hasil dari operasi matematika.

  5. Tutup aplikasi dengan benar dengan memasukkan perintah n.

Kode selesai

Berikut adalah kode lengkap untuk file CalculatorLibrary.cs, setelah Anda menyelesaikan semua langkah:

// CalculatorLibrary.cs
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 inilah kode untuk Program.cs:

// 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 langkah:

// CalculatorLibrary.cs
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 inilah kode untuk Program.cs:

// 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.
                // Use Nullable types (with ?) to match type of System.Console.ReadLine
                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();

                // Validate input is not null, and matches the pattern
                if (op == null || ! Regex.IsMatch(op, "[a|s|m|d]"))
                {
                   Console.WriteLine("Error: Unrecognized input.");
                }
                else
                { 
                   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: