Bagikan melalui


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:

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.

  1. Pada Penjelajah Solusi, klik kanan node solusi dan pilih Tambahkan>Proyek Baru.

  2. Di jendela Tambahkan proyek baru, ketik pustaka kelas di kotak Pencarian. Pilih pola dasar proyek Pustaka kelas C#, lalu pilih Berikutnya.

    Screenshot of Class Library project template selection.

  3. Pada layar Konfigurasikan 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.

    Screenshot of Solution Explorer with the CalculatorLibrary class library project added.

  5. 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.

  6. 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.

    Screenshot of the Add Project Reference menu item.

    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.

  7. Dalam kotak dialog Pengelola Referensi, pilih kotak centang untuk proyek CalculatorLibrary, lalu pilih Oke.

    Screenshot of the Reference Manager dialog box.

    Referensi proyek muncul di node Proyek pada Penjelajah Solusi.

    Screenshot of Solution Explorer with project reference.

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

    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;
             }
         }
     }
    
  9. Program.cs juga memiliki referensi, tetapi kesalahan mengatakan Calculator.DoOperation panggilan tidak teratasi. Kesalahan ini karena CalculatorLibrary berada di namespace yang berbeda. Untuk referensi yang memenuhi syarat sepenuhnya, Anda dapat menambahkan namespace CalculatorLibrary ke panggilan Calculator.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 namespace CalculatorLibrary dari situs panggilan, tetapi sekarang ada ambiguitas. Apakah kelas Calculator di dalam CalculatorLibrary, atau merupakan namespace Calculator?

    Untuk memperbaiki ambiguitas ini, ganti nama namespace dari Calculator ke CalculatorProgram di Program.cs.

    namespace CalculatorProgram
    
  1. Pada Penjelajah Solusi, klik kanan node solusi dan pilih Tambahkan>Proyek Baru.

  2. Di jendela Tambahkan proyek baru, ketik pustaka kelas di kotak Pencarian. Pilih pola dasar proyek Pustaka kelas C#, lalu pilih Berikutnya.

    Screenshot of Class Library project template selection.

  3. Pada layar Konfigurasikan 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.

    Screenshot of Solution Explorer with the CalculatorLibrary class library project added.

  5. 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.

  6. 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.

    Screenshot of the Add Project Reference menu item.

    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.

  7. Dalam kotak dialog Pengelola Referensi, pilih kotak centang untuk proyek CalculatorLibrary, lalu pilih Oke.

    Screenshot of the Reference Manager dialog box.

    Referensi proyek muncul di node Proyek pada Penjelajah Solusi.

    Screenshot of Solution Explorer with project reference.

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

    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;
             }
         }
     }
    
  9. Program.cs juga memiliki referensi, tetapi kesalahan mengatakan Calculator.DoOperation panggilan tidak teratasi. Kesalahan ini karena CalculatorLibrary berada di namespace yang berbeda. Untuk referensi yang memenuhi syarat sepenuhnya, Anda dapat menambahkan namespace CalculatorLibrary ke panggilan Calculator.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 namespace CalculatorLibrary dari situs panggilan, tetapi sekarang ada ambiguitas. Apakah kelas Calculator di dalam CalculatorLibrary, atau merupakan namespace Calculator?

    Untuk memperbaiki ambiguitas ini, ganti nama namespace dari Calculator ke CalculatorProgram 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.

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

    using System.IO;
    using System.Diagnostics;
    
  2. 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 kelas Calculator pada CalculatorLibrary.cs.

    Selain itu, hapus kata kunci static untuk mengubah metode DoOperation 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)
       {
    
  3. 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;
     }
    
  4. 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 perulangan while (!endApp):

    Calculator calculator = new Calculator();
    

    Selain itu, ubah situs panggilan DoOperation untuk mereferensikan objek bernama calculator dalam huruf kecil. Sekarang kode menjadi invokasi anggota, bukan panggilan ke metode statik.

    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 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.

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

    using System.Diagnostics;
    
  2. 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 kelas Calculator pada CalculatorLibrary.cs.

    Selain itu, hapus kata kunci static untuk mengubah metode DoOperation 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)
       {
    
  3. 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;
     }
    
  4. 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 perulangan while (!endApp):

    Calculator calculator = new Calculator();
    

    Selain itu, ubah situs panggilan DoOperation untuk mereferensikan objek bernama calculator dalam huruf kecil. Sekarang kode menjadi invokasi anggota, bukan panggilan ke metode statik.

    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 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.

  1. Di Penjelajah Solusi, klik kanan node Dependensi untuk proyek CalculatorLibrary, dan pilih Kelola Paket NuGet.

    Screenshot of Manage NuGet Packages on the shortcut menu.

    Screenshot of Manage NuGet Packages on the shortcut menu.

    Pengelola Paket NuGet terbuka.

    Screenshot of the NuGet Package Manager.

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

    Screenshot of Newtonsoft J SON NuGet package information in the NuGet Package Manager.

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

    Screenshot of Newtonsoft J SON NuGet package information in the NuGet Package Manager. 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 untuk Newtonsoft.Json di awal CalculatorLibrary.cs.

    using Newtonsoft.Json;
    
  3. Buat objek anggota JsonWriter lalu ganti konstruktor Calculator 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();
         }
    
  4. Ubah metode DoOperation untuk menambahkan kode JSON writer:

         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 sintaksis JSON setelah pengguna selesai memasukkan data operasi.

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

             // Add call to close the JSON writer before return
             calculator.Finish();
             return;
         }
    
  7. Bangun dan jalankan aplikasi, dan setelah Anda 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
         }
     ]
    }
    

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.

  1. 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.

    Screenshot that shows setting a breakpoint.

  2. 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.

    Screenshot of hitting a breakpoint

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

Men-debug: Melihat variabel

  1. Di kode yang disorot, arahkan kursor ke variabel seperti cleanNum1 dan op. Nilai saat ini untuk variabel tersebut, 8 dan d muncul berurutan di DataTips.

    Screenshot that shows viewing a DataTip.

    Saat melakukan penelusuran kesalahan, Anda sering kali harus memeriksa apakah variabel memiliki nilai yang Anda harapkan untuk memperbaiki masalah.

  2. 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.

    Screenshot of the Locals window.

    Screenshot of the Locals window.

  3. 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

  1. 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.

    Screenshot of step into command

    Anda baru saja masuk ke metode DoOperation di kelas Calculator.

  2. Untuk mendapatkan tampilan hierarkis pada alur program Anda, lihat jendela Tumpukan Panggilan. Jika tertutup, pilih Debug>Windows>Tumpukan Panggilan untuk membukanya.

    Screenshot of the call stack

    Tampilan ini menunjukkan metode Calculator.DoOperation saat ini, yang ditandai dengan penunjuk kuning. Baris kedua menunjukkan fungsi yang memanggil metode tersebut, dari metode Main 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.

  3. 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.

  4. 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

  1. 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.

  2. Tekan F10 untuk menjalankan baris kode.

  3. Jika Anda mengarahkan mouse ke atas variabel result, nilai Tak Terbatas akan ditunjukkan. Dalam C#, Tak Terbatas adalah hasil saat Anda membagi dengan nol.

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

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

  5. 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: