Aracılığıyla paylaş


Öğretici: C# konsol uygulamasını genişletme ve Visual Studio'da hata ayıklama (bölüm 2/2)

Bu öğretici serisinin 2. bölümünde, günlük geliştirme için ihtiyacınız olan Visual Studio derlemesi ve hata ayıklama özelliklerine biraz daha ayrıntılı bir şekilde göz atacaksınız. Bu özellikler birden çok proje yönetmeyi, hata ayıklamayı ve üçüncü taraf paketlerine başvurmayı içerir. Bu öğreticinin 1. Bölümünde oluşturduğunuz C# konsol uygulamasını çalıştırır ve Visual Studio tümleşik geliştirme ortamının (IDE) bazı özelliklerini keşfedersiniz. Bu öğretici, iki bölümden oluşan bir öğretici serisinin 2. bölümüdür.

Bu öğreticide, aşağıdaki görevleri tamamlayacaksınız:

  • İkinci bir proje ekleyin.
  • Referans kütüphaneleri ve paketleri ekleyin.
  • Kodunuzun hatalarını ayıklayın.
  • Tamamlanan kodunuzu inceleyin.

Önkoşullar

Bu makalenin üzerinden geçmek için şu hesap makinesi uygulamalarından birini kullanabilirsiniz:

Başka bir proje ekleme

Gerçek dünya kodu, projelerin bir çözümde birlikte çalışmasını içerir. Hesap makinesi uygulamanıza bazı hesap makinesi işlevleri sağlayan bir sınıf kitaplığı projesi ekleyebilirsiniz.

Visual Studio'da, yeni proje eklemek için Dosya>Yeni Proje> menü komutunu kullanırsınız. Bağlam menüsünden proje eklemek için Çözüm Gezgini'nde çözüme sağ tıklayabilirsiniz.

  1. Çözüm Gezgini'nde çözüm düğümüne sağ tıklayın veYeni Proje Ekle'yi> seçin.

  2. Yeni proje ekle penceresinde, Arama kutusuna sınıf kitaplığı yazın. C# Sınıf kitaplığı proje şablonunu seçin ve ardından İleri'yi seçin.

    Sınıf Kitaplığı proje şablonu seçiminin ekran görüntüsü.

  3. Yeni projenizi yapılandırın ekranında CalculatorLibrary proje adını yazın ve İleri'yi seçin.

  4. Ek bilgiler ekranında .NET 8.0 seçilidir. Oluştur'i seçin.

    Visual Studio yeni projeyi oluşturur ve çözüme ekler.

    CalculatorLibrary sınıf kitaplığı projesinin eklendiği Çözüm Gezgini'nin ekran görüntüsü.

  5. Class1.cs dosyasını CalculatorLibrary.cs olarak yeniden adlandırın. Dosyayı yeniden adlandırmak için Çözüm Gezgini'nde ada sağ tıklayıp Yeniden Adlandır'ı seçebilir, adı seçip F2 tuşuna basabilir veya adı seçip yeniden seçerek yazabilirsiniz.

    Dosyadaki tüm Class1 referanslarını yeniden adlandırmak isteyip istemediğinizi bir ileti sorabilir. Nasıl yanıtladığınız önemli değildir, çünkü kodu gelecekteki bir adımda değiştireceksiniz.

  6. Şimdi bir proje başvurusu ekleyin, böylece ilk proje yeni sınıf kitaplığının kullanıma açık olduğu API'leri kullanabilir. Hesap Makinesi projesinde Bağımlılıklar düğümüne sağ tıklayın ve Proje Başvurusu Ekle'yi seçin.

    Proje Başvurusu Ekle menü öğesinin ekran görüntüsü.

    Başvuru Yöneticisi iletişim kutusu görüntülenir. Bu iletişim kutusunda, projelerinizin ihtiyaç duyduğu diğer projelere, derlemelere ve COM DLL'lerine başvurular ekleyebilirsiniz.

  7. Başvuru Yöneticisi iletişim kutusunda CalculatorLibrary projesinin onay kutusunu seçin ve ardından Tamam'ı seçin.

    Başvuru Yöneticisi iletişim kutusunun ekran görüntüsü.

    Proje başvurusu, Çözüm Gezgini'ndekiProjeler düğümü altında görünür.

    Proje başvurusu içeren Çözüm Gezgini'nin ekran görüntüsü.

  8. Program.cs sınıfını Calculator ve tüm kodunu seçin ve kesmek için Ctrl+X tuşuna basın. Ardından CalculatorLibrary.cs içeriğini CalculatorLibrary namespace'ine yapıştırın.

    Ayrıca, Calculator sınıfının dışında kullanılabilir hale getirmek için sınıfın önüne public ekleyin.

    CalculatorLibrary.cs şimdi aşağıdaki koda benzemelidir:

     // 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 dosyasına da bir başvuru var, ancak bir hata mesajı Calculator.DoOperation çağrısının çözümlenemediğini söylüyor. Hatanın nedeni CalculatorLibrary farklı bir ad alanında olmasıdır. CalculatorLibrary ad alanını tam nitelikli bir başvuru için Program.cs çağrısına Calculator.DoOperation ekleyebilirsiniz:

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

    Veya using dosyasının başına yönerge eklemeyi deneyebilirsiniz:

    // Program.cs
    using CalculatorLibrary;
    

    yönergesinin using eklenmesi, ad alanını CalculatorLibrary çağrı sitesinden kaldırmanıza olanak verir.

    Kodunuz Program.cs ad alanındaysa Calculator, sınıf adı ve ad alanı adı arasındaki belirsizliği kaldırmak için Calculator ad alanını CalculatorProgram olarak yeniden adlandırın.

.NET kitaplıklarına başvurma: Bir log dosyasına yazma

Tüm işlemlerin günlüğünü eklemek ve bir metin dosyasına yazmak için .NET İzleme sınıfını kullanabilirsiniz. sınıfı Trace , temel yazdırma hata ayıklama teknikleri için de kullanışlıdır. Trace sınıfı, System.Diagnostics içinde bulunur ve System.IO gibi sınıfları kullanır StreamWriter.

  1. CalculatorLibrary.cs en üstüne yönergeleri ekleyerek usingbaşlayın:

    // CalculatorLibrary.cs
    using System.Diagnostics;
    
  2. Trace sınıfının bu kullanımı, bir dosya akışıyla ilişkilendirilen sınıf referansını saklamalıdır. Bu gereksinim, hesap makinesinin nesne olarak daha iyi çalıştığı anlamına gelir, bu nedenle Calculator sınıfının başına bir oluşturucu ekleyin.

    Ayrıca statik static metodu üye metot haline getirmek için DoOperation anahtar sözcüğünü kaldırın.

    // 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. Her hesaplamaya log çıktısı ekleyin. DoOperation şimdi aşağıdaki kod gibi görünmelidir:

    // 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. Program.cs dosyasına geri dönerken, kırmızı dalgalı alt çizgi artık statik çağrıyı işaretliyor. Hatayı düzeltmek için, döngünün hemen öncesine calculator aşağıdaki kod satırını ekleyerek bir while (!endApp) değişken oluşturun:

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

    Ayrıca calculator küçük harfle adlandırılan nesneye başvuracak şekilde DoOperation çağrı noktasını değiştirin. Kod artık statik bir yönteme yapılan çağrı yerine bir üye çağrısıdır.

    // Program.cs
    result = calculator.DoOperation(cleanNum1, cleanNum2, op);
    
  5. Uygulamayı yeniden çalıştırın. İşiniz bittiğinde Hesap Makinesi proje düğümüne sağ tıklayın ve Dosya Gezgini'nde Klasör Aç'ı seçin.

  6. Dosya Gezgini'nde, bölme/Hata Ayıkla/ altındaki çıkış klasörüne gidin ve calculator.log dosyasını açın. Çıktı şöyle görünmelidir:

    Starting Calculator Log
    Started 7/9/2020 1:58:19 PM
    1 + 2 = 3
    3 * 3 = 9
    

Bu noktada CalculatorLibrary.cs şu koda benzemelidir:

// 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 aşağıdaki kod gibi görünmelidir:

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

NuGet Paketi Ekleme: JSON dosyasına yazma

Nesne verilerini depolamak için popüler ve taşınabilir bir biçim olan JSON'da işlemlerin çıktısını almak için Newtonsoft.Json NuGet paketine başvurabilirsiniz. NuGet paketleri.NET sınıf kitaplıkları için birincil dağıtım yöntemidir.

  1. Çözüm Gezgini'ndeCalculatorLibrary projesinin Bağımlılıklar düğümüne sağ tıklayın ve NuGet Paketlerini Yönet'i seçin.

    Kısayol menüsündeki NuGet Paketlerini Yönet'in ekran görüntüsü.

    NuGet Paket Yöneticisi açılır.

  2. Newtonsoft.Json paketini arayıp seçin ve Yükle'yi seçin.

    NuGet Paket Yöneticisi'ndeki Newtonsoft J SON NuGet paket bilgilerinin ekran görüntüsü.

    Değişiklikleri kabul edip etmeyeceğiniz sorulursa Tamam'ı seçin.

    Visual Studio paketi indirir ve projeye ekler. Çözüm Gezgini'ndekiPaketler düğümünde yeni bir giriş görüntülenir.

    using'nin başına bir Newtonsoft.Json yönergesi ekleyin.

    // CalculatorLibrary.cs
    using Newtonsoft.Json;
    
  3. JsonWriter Üye nesnesini oluşturun ve oluşturucuyu Calculator aşağıdaki kodla değiştirin:

         // 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. DoOperation JSON writer kodunu eklemek için yöntemini değiştirin:

         // 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. Kullanıcı işlem verilerini girmeyi bitirdikten sonra JSON söz dizimini tamamlamak için bir yöntem ekleyin.

     // CalculatorLibrary.cs
     public void Finish()
     {
         writer.WriteEndArray();
         writer.WriteEndObject();
         writer.Close();
     }
    
  6. Sonuna Program.cs, return;öğesinden önce, Finish bir çağrı ekleyin.

         // Program.cs
             // Add call to close the JSON writer before return
             calculator.Finish();
             return;
         }
    
  7. Uygulamayı derleyip çalıştırın ve birkaç işlem girmeyi tamamladıktan sonra n komutunu girerek uygulamayı kapatın.

  8. calculatorlog.json dosyasını Dosya Gezgini'nde açın. Aşağıdaki içeriğe benzer bir şey görmeniz gerekir:

    {
     "Operations": [
         {
         "Operand1": 2.0,
         "Operand2": 3.0,
         "Operation": "Add",
         "Result": 5.0
         },
         {
         "Operand1": 3.0,
         "Operand2": 4.0,
         "Operation": "Multiply",
         "Result": 12.0
         }
     ]
    }
    

Hata ayıklama: Kesme noktası ayarla ve vur

Visual Studio hata ayıklayıcısı güçlü bir araçtır. Hata ayıklayıcı, bir programlama hatasının tam noktasını bulmak için kodunuzda adım adım ilerleyebilir. Daha sonra hangi düzeltmeleri yapmanız gerektiğini anlayabilir ve uygulamanızı çalıştırmaya devam edebilmeniz için geçici değişiklikler yapabilirsiniz.

  1. Program.cs'da, aşağıdaki kod satırının solundaki oluklara tıklayın. Satıra tıklayıp F9'a tıklayabilir veya satıra sağ tıklayıp Kesme Noktası> seçebilirsiniz.

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

    Görüntülenen kırmızı nokta bir kesme noktasını gösterir. Kesme noktalarını kullanarak uygulamanızı duraklatabilir ve kodu inceleyebilirsiniz. Herhangi bir yürütülebilir kod satırında kesme noktası ayarlayabilirsiniz.

    Kesme noktası ayarlamayı gösteren ekran görüntüsü.

  2. Uygulamayı derleyin ve çalıştırın. Hesaplama için aşağıdaki değerleri girin:

    • İlk sayı için 8 girin.
    • İkinci sayı için 0 girin.
    • Operatör için biraz eğlenelim. D girin.

    Uygulama, soldaki sarı işaretçi ve vurgulanan kodla gösterilen kesme noktasını oluşturduğunuz yeri askıya alır. Vurgulanan kod henüz yürütülmedi.

    Kesme noktasına isabet eden ekran görüntüsü

    Artık uygulama askıya alınırken uygulama durumunuzu inceleyebilirsiniz.

Hata ayıklama: Değişkenleri görüntüleme

  1. Vurgulanan kodda, cleanNum1 ve op gibi değişkenlerin üzerine gelin. Bu değişkenlerin 8 ve d sırasıyla geçerli değerleri Veri İpuçları'nda görünür.

    Veri İpucu'nu görüntülemeyi gösteren ekran görüntüsü.

    Hata ayıklama sırasında, değişkenlerin beklediğiniz değerleri barındırıp barındırmadığını kontrol etmek genellikle sorunları çözmek için kritik önem taşır.

  2. Alt bölmede Yerel Ayarlar penceresine bakın. Kapalıysa Açmak içinWindows>YerelLerinde> seçin.

    Yerel Ayarlar penceresi, şu anda kapsamda olan her değişkenin yanı sıra değeri ve türünü gösterir.

    Yerel Ayarlar penceresinin ekran görüntüsü.

  3. Otomatikler penceresine bakın.

    Otomatikler penceresi Yerel Ayarlar penceresine benzer, ancak uygulamanızın duraklatıldığı geçerli kod satırından hemen önce gelen ve izleyen değişkenleri gösterir.

    Uyarı

    Eğer Otomatikler penceresini görmüyorsanız, Hatalarını Ayıkla>Windows>Otomatikler'i seçerek açın.

Ardından, hata ayıklayıcıda adım adım kodu yürütün; bu işleme adımlama denir.

Hata ayıklama: Kodda adım adım ilerleyin

  1. F11 tuşuna basın veya Hata Ayıkla>Adımla'yı seçin.

    İçine Adımla komutunu kullanarak uygulama geçerli deyimi yürütür ve genellikle bir sonraki kod satırı olan bir sonraki yürütülebilir deyime ilerler. Soldaki sarı işaretçi her zaman geçerli deyimi gösterir.

    Step into komutunun ekran görüntüsü

    Calculator sınıfındaki DoOperation yöntemine yeni girdiniz.

  2. Program akışınıza hiyerarşik bir bakış elde etmek için Çağrı Yığını penceresine bakın. Kapalıysa Açmak içinWindows>Çağrı Yığını> seçin.

    Çağrı yığınının ekran görüntüsü

    Bu görünüm, sarı işaretçiyle gösterilen geçerli Calculator.DoOperation yöntemi gösterir. İkinci satır, Main yönteminden yöntemini çağıran işlevi gösterir.

    Çağrı Yığını penceresi, yöntemlerin ve işlevlerin çağrılma sırasını gösterir. Bu pencere, kısayol menüsünden Kaynak Koduna Git gibi birçok hata ayıklayıcı özelliğine de erişim sağlar.

  3. F10 tuşuna basın veya uygulama switch deyiminde durana kadar birkaç kez Hata Ayıklama menüsünden Adım Aş'ı seçin.

    // CalculatorLibrary.cs
    switch (op)
    {
    

    Adım Atla komutu, Adımla komutuna benzer, ancak eğer geçerli deyim bir işlev çağırırsa, hata ayıklayıcı işlevdeki kodu çalıştırır ve işlev dönene kadar yürütmeyi askıya almaz. Belirli bir işlevle ilgilenmiyorsanız Step Over, Step Into'dan daha hızlıdır.

  4. Uygulamanın aşağıdaki kod satırında duraklatması için F10'a bir kez daha basın.

    // CalculatorLibrary.cs
    if (num2 != 0)
    {
    

    Bu kod, sıfıra bölme durumunu denetler. Uygulama devam ederse genel bir özel durum (hata) oluşturur, ancak konsolda döndürülen gerçek değeri görüntüleme gibi başka bir şey denemek isteyebilirsiniz. Bir seçenek, kodda değişiklik yapmak ve ardından hata ayıklamaya devam etmek için düzenle ve devam et adlı bir hata ayıklayıcı özelliği kullanmaktır. Ancak, yürütme akışını geçici olarak değiştirmek için farklı bir püf noktası vardır.

Hata ayıklama: Geçici bir değişikliği test edin

  1. Şu anda if (num2 != 0) deyiminde duraklatılmış olan sarı işaretçiyi seçin ve onu bir sonraki deyime sürükleyin.

    // CalculatorLibrary.cs
    result = num1 / num2;
    

    İmleci buraya sürüklemeniz if deyimini tamamen atlamasına neden olur, böylece sıfıra böldüğünüzde ne olduğunu görebilmeniz için.

  2. Kod satırını yürütmek için F10 tuşuna basın.

  3. Değişkenin üzerine geldiğinizde resultSonsuz değeri gösterilir. C# dilinde Infinity, sıfıra böldüğünüzde elde edilen sonuç olur.

  4. F5 tuşuna basın veya Hata Ayıklamaya>Devam Hata Ayıklama'yı seçin.

    Matematik işleminin sonucu olarak konsolda sonsuzluk simgesi görünür.

  5. n komutunu girerek uygulamayı düzgün bir şekilde kapatın.

Kod tamamlandı

Tüm adımları tamamladıktan sonra CalculatorLibrary.cs dosyasının tam kodu aşağıdadır:

// 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();
        }
    }
}

Program.cs kodu şu şekildedir:

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

Sonraki Adımlar

Bu öğreticiyi tamamladığınız için tebrikler! Daha fazla bilgi edinmek için aşağıdaki içerikle devam edin: