Öğ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.
- Başvuru kitaplıkları ve paketleri ekleme.
- 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:
- Bu öğreticinin 1. bölümünde yer alan hesap makinesi konsol uygulaması.
- vs-tutorial-samples deposundaki C# hesap makinesi uygulaması. Başlamak için uygulamayı depodan açın.
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 Ekle>menü komutunu kullanırsınız. Ayrıca, bağlam menüsünden proje eklemek için Çözüm Gezgini'de çözüme sağ tıklayabilirsiniz.
Çözüm Gezgini'de çözüm düğümüne sağ tıklayın ve Yeni Proje Ekle'yi>seçin.
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.
Yeni projenizi yapılandırın ekranında CalculatorLibrary proje adını yazın ve İleri'yi seçin.
sorulduğunda .NET 3.1'i seçin. Visual Studio yeni projeyi oluşturur ve çözüme ekler.
Class1.cs dosyasını CalculatorLibrary.cs olarak yeniden adlandırın. Dosyayı yeniden adlandırmak için, Çözüm Gezgini'da ada sağ tıklayıp Yeniden Adlandır'ı seçebilir, adı seçip F2 tuşuna basabilir veya adı seçip yeniden yazabilirsiniz.
Bir ileti, dosyadaki başvuruları
Class1
yeniden adlandırmak isteyip istemediğinizi sorabilir. Nasıl yanıtladığınız önemli değildir, çünkü kodu gelecekteki bir adımda değiştireceksiniz.Ş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.
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.
Başvuru Yöneticisi iletişim kutusunda CalculatorLibrary projesinin onay kutusunu seçin ve ardından Tamam'ı seçin.
Proje başvurusu, Çözüm Gezgini'daki Projelerdüğümü altında görünür.
Program.cs dosyasında sınıfını ve tüm kodunu seçin
Calculator
ve kesmek için Ctrl+X tuşuna basın. Ardından CalculatorLibrary.cs dosyasında koduCalculatorLibrary
ad alanına yapıştırın.Ayrıca kitaplığın dışında kullanıma açmak için Calculator sınıfından önce ekleyin
public
.CalculatorLibrary.cs artık aşağıdaki koda benzemelidir:
using System; namespace CalculatorLibrary { public class Calculator { public static double DoOperation(double num1, double num2, string op) { double result = double.NaN; // Default value is "not-a-number" if an operation, such as division, could result in an error. // Use a switch statement to do the math. switch (op) { case "a": result = num1 + num2; break; case "s": result = num1 - num2; break; case "m": result = num1 * num2; break; case "d": // Ask the user to enter a non-zero divisor. if (num2 != 0) { result = num1 / num2; } break; // Return text for an incorrect option entry. default: break; } return result; } } }
Program.cs dosyasının da bir başvurusu vardır, ancak çağrının
Calculator.DoOperation
çözümlenemedi hatası vardır. Hatanın nedeniCalculatorLibrary
farklı bir ad alanında olmasıdır. Tam başvuru için ad alanınıCalculatorLibrary
çağrısınaCalculator.DoOperation
ekleyebilirsiniz:result = CalculatorLibrary.Calculator.DoOperation(cleanNum1, cleanNum2, op);
İsterseniz, dosyanın başına bir
using
yönerge eklemeyi de deneyebilirsiniz:using CalculatorLibrary;
yönergesinin
using
eklenmesi, ad alanınıCalculatorLibrary
çağrı sitesinden kaldırmanıza olanak verir, ancak artık bir belirsizlik vardır. sınıfı içindeCalculatorLibrary
miCalculator
yoksa ad alanı mıCalculator
?Belirsizliği çözmek için ad alanını Program.cs dosyasında olarak
Calculator
CalculatorProgram
yeniden adlandırın.namespace CalculatorProgram
Çözüm Gezgini'de çözüm düğümüne sağ tıklayın ve Yeni Proje Ekle'yi>seçin.
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.
Yeni projenizi yapılandırın ekranında CalculatorLibrary proje adını yazın ve İleri'yi seçin.
Ek bilgiler ekranında .NET 8.0 seçilidir. Oluştur'u belirleyin.
Visual Studio yeni projeyi oluşturur ve çözüme ekler.
Class1.cs dosyasını CalculatorLibrary.cs olarak yeniden adlandırın. Dosyayı yeniden adlandırmak için, Çözüm Gezgini'da ada sağ tıklayıp Yeniden Adlandır'ı seçebilir, adı seçip F2 tuşuna basabilir veya adı seçip yeniden yazabilirsiniz.
Bir ileti, dosyadaki tüm başvuruları yeniden adlandırmak
Class1
isteyip istemediğinizi sorabilir. Nasıl yanıtladığınız önemli değildir, çünkü kodu gelecekteki bir adımda değiştireceksiniz.Ş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.
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.
Başvuru Yöneticisi iletişim kutusunda CalculatorLibrary projesinin onay kutusunu seçin ve ardından Tamam'ı seçin.
Proje başvurusu, Çözüm Gezgini'daki Projelerdüğümü altında görünür.
Program.cs dosyasında sınıfını ve tüm kodunu seçin
Calculator
ve kesmek için Ctrl+X tuşuna basın. Ardından CalculatorLibrary.cs dosyasında koduCalculatorLibrary
ad alanına yapıştırın.Ayrıca kitaplığın dışında kullanıma açmak için Calculator sınıfından önce ekleyin
public
.CalculatorLibrary.cs artık aşağıdaki koda benzemelidir:
namespace CalculatorLibrary { public class Calculator { public static double DoOperation(double num1, double num2, string op) { double result = double.NaN; // Default value is "not-a-number" if an operation, such as division, could result in an error. // Use a switch statement to do the math. switch (op) { case "a": result = num1 + num2; break; case "s": result = num1 - num2; break; case "m": result = num1 * num2; break; case "d": // Ask the user to enter a non-zero divisor. if (num2 != 0) { result = num1 / num2; } break; // Return text for an incorrect option entry. default: break; } return result; } } }
Program.cs dosyasının da bir başvurusu vardır, ancak çağrının
Calculator.DoOperation
çözümlenemedi hatası vardır. Hatanın nedeniCalculatorLibrary
farklı bir ad alanında olmasıdır. Tam başvuru için ad alanınıCalculatorLibrary
çağrısınaCalculator.DoOperation
ekleyebilirsiniz:result = CalculatorLibrary.Calculator.DoOperation(cleanNum1, cleanNum2, op);
İsterseniz, dosyanın başına bir
using
yönerge eklemeyi de deneyebilirsiniz:using CalculatorLibrary;
yönergesinin
using
eklenmesi, ad alanınıCalculatorLibrary
çağrı sitesinden kaldırmanıza olanak verir, ancak artık bir belirsizlik vardır. sınıfı içindeCalculatorLibrary
miCalculator
yoksa ad alanı mıCalculator
?Belirsizliği çözmek için ad alanını Program.cs dosyasında olarak
Calculator
CalculatorProgram
yeniden adlandırın.namespace CalculatorProgram
.NET kitaplıklarına başvurma: Günlüğe 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ı içindedir System.Diagnostics
ve gibi StreamWriter
sınıflar kullanırSystem.IO
.
CalculatorLibrary.cs dosyasının en üstüne yönergeleri ekleyerek
using
başlayın:using System.IO; using System.Diagnostics;
Sınıfın
Trace
bu kullanımı, bir dosya akışıyla ilişkilendirdiği sınıf başvurusuna sahip olmalıdır. Bu gereksinim, hesap makinesinin nesne olarak daha iyi çalıştığı anlamına gelir, bu nedenle CalculatorLibrary.cs'de sınıfınCalculator
başına bir oluşturucu ekleyin.Ayrıca statik
DoOperation
yöntemi üye yöntemine dönüştürmek için anahtar sözcüğünü kaldırınstatic
.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) {
Her hesaplamaya günlük çıkışı ekleyin.
DoOperation
şimdi aşağıdaki kod gibi görünmelidir: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 dosyasına döndüğünüzde kırmızı dalgalı alt çizgi artık statik çağrıyı işaretlemektedir. Hatayı düzeltmek için, döngünün hemen öncesine
while (!endApp)
aşağıdaki kod satırını ekleyerek bircalculator
değişken oluşturun:Calculator calculator = new Calculator();
Ayrıca çağrı sitesini küçük harfle adlı
calculator
nesneye başvuracak şekilde değiştirinDoOperation
. Kod artık statik bir yönteme yapılan çağrı yerine bir üye çağrısıdır.result = calculator.DoOperation(cleanNum1, cleanNum2, op);
Uygulamayı yeniden çalıştırın. İşiniz bittiğinde Hesap Makinesi proje düğümüne sağ tıklayın ve Dosya Gezgini Klasörü Aç'ı seçin.
Dosya Gezgini içinde, bölme/Hata Ayıkla/ altındaki çıkış klasörüne gidin ve calculator.log dosyasını açın. Çıkış aşağıdakine benzer olmalıdır:
Starting Calculator Log Started 7/9/2020 1:58:19 PM 1 + 2 = 3 3 * 3 = 9
Bu noktada CalculatorLibrary.cs şu koda benzemelidir:
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 aşağıdaki kod gibi görünmelidir:
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;
}
}
}
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ı içindedir System.Diagnostics
ve gibi StreamWriter
sınıflar kullanırSystem.IO
.
CalculatorLibrary.cs dosyasının en üstüne yönergeleri ekleyerek
using
başlayın:using System.Diagnostics;
Sınıfın
Trace
bu kullanımı, bir dosya akışıyla ilişkilendirdiği sınıf başvurusuna sahip olmalıdır. Bu gereksinim, hesap makinesinin nesne olarak daha iyi çalıştığı anlamına gelir, bu nedenle CalculatorLibrary.cs'de sınıfınCalculator
başına bir oluşturucu ekleyin.Ayrıca statik
DoOperation
yöntemi üye yöntemine dönüştürmek için anahtar sözcüğünü kaldırınstatic
.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) {
Her hesaplamaya günlük çıkışı ekleyin.
DoOperation
şimdi aşağıdaki kod gibi görünmelidir: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 dosyasına döndüğünüzde kırmızı dalgalı alt çizgi artık statik çağrıyı işaretlemektedir. Hatayı düzeltmek için, döngünün hemen öncesine
while (!endApp)
aşağıdaki kod satırını ekleyerek bircalculator
değişken oluşturun:Calculator calculator = new Calculator();
Ayrıca çağrı sitesini küçük harfle adlı
calculator
nesneye başvuracak şekilde değiştirinDoOperation
. Kod artık statik bir yönteme yapılan çağrı yerine bir üye çağrısıdır.result = calculator.DoOperation(cleanNum1, cleanNum2, op);
Uygulamayı yeniden çalıştırın. İşiniz bittiğinde Hesap Makinesi proje düğümüne sağ tıklayın ve Dosya Gezgini Klasörü Aç'ı seçin.
Dosya Gezgini içinde, bölme/Hata Ayıkla/ altındaki çıkış klasörüne gidin ve calculator.log dosyasını açın. Çıkış aşağıdakine benzer olmalıdır:
Starting Calculator Log Started 7/9/2020 1:58:19 PM 1 + 2 = 3 3 * 3 = 9
Bu noktada CalculatorLibrary.cs şu koda benzemelidir:
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:
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;
}
}
}
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.
Çözüm Gezgini'da CalculatorLibrary projesi için Bağımlılıklar düğümüne sağ tıklayın ve NuGet Paketlerini Yönet'i seçin.
NuGet Paket Yöneticisi açılır.
Newtonsoft.Json paketini arayıp seçin ve Yükle'yi seçin.
Visual Studio paketi indirir ve projeye ekler. Çözüm Gezgini'daki Başvurular düğümünde yeni bir girdi görüntülenir.
Değişiklikleri kabul edip etmeyeceğiniz sorulursa Tamam'ı seçin.
Visual Studio paketi indirir ve projeye ekler. Çözüm Gezgini'deki Paketler düğümünde yeni bir giriş görüntülenir.
CalculatorLibrary.cs dosyasının başına için
Newtonsoft.Json
birusing
yönerge ekleyin.using Newtonsoft.Json;
JsonWriter
Üye nesnesini oluşturun ve oluşturucuyuCalculator
aşağıdaki kodla değiştirin: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(); }
DoOperation
JSONwriter
kodunu eklemek için yöntemini değiştirin: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; }
Kullanıcı işlem verilerini girmeyi bitirdikten sonra JSON söz dizimini tamamlamak için bir yöntem ekleyin.
public void Finish() { writer.WriteEndArray(); writer.WriteEndObject(); writer.Close(); }
Program.cs dosyasının sonunda, öncesinde
return;
öğesineFinish
bir çağrı ekleyin:// Add call to close the JSON writer before return calculator.Finish(); return; }
Uygulamayı derleyip çalıştırın ve birkaç işlem girmeyi tamamladıktan sonra n komutunu girerek uygulamayı kapatın.
calculatorlog.json dosyasını Dosya Gezgini 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ı ayarlama ve isabet
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.
Program.cs dosyasında, aşağıdaki kod satırının sol kısmındaki cilt payı'na tıklayın. Satıra tıklayıp F9'a tıklayabilir veya satıra sağ tıklayıp Kesme Noktası Ekle Kesme Noktası'nı> seçebilirsiniz.
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.
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.
Artık uygulama askıya alınırken uygulama durumunuzu inceleyebilirsiniz.
Hata ayıklama: Değişkenleri görüntüleme
Vurgulanan kodda ve
op
gibicleanNum1
değişkenlerin üzerine gelin. Bu değişkenlerin8
ved
sırasıyla geçerli değerleri Data İpuçları içinde görünür.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.
Alt bölmede Yerel Ayarlar penceresine bakın. Kapalıysa Açmak için Windows>YerelLerinde Hata Ayıkla'yı>seçin.
Yerel Ayarlar penceresi, şu anda kapsamda olan her değişkenin yanı sıra değeri ve türünü gösterir.
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.
Not
Otomatikler penceresini görmüyorsanız Windows OtomatikLeri Hatalarını Ayıkla'yı>> seçerek açın.
Ardından, hata ayıklayıcıda bir kerede bir deyim olan ve adımlama olarak adlandırılan kodu yürütür.
Hata ayıklama: Kodda adım adım ilerleyin
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.
Sınıfındaki yöntemine
DoOperation
yeni girdinizCalculator
.Program akışınıza hiyerarşik bir bakış elde etmek için Çağrı Yığını penceresine bakın. Kapalıysa Açmak için Windows>Çağrı Yığını hatalarını ayıkla'yı>seçin.
Bu görünüm, sarı işaretçiyle gösterilen geçerli
Calculator.DoOperation
yöntemi gösterir. İkinci satır, Program.cs dosyasındaki yöntemindenMain
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.
F10 tuşuna basın veya uygulama deyiminde
switch
duraklatana kadar birkaç kez Hata Ayıkla>Adımını Aş'ı seçin.switch (op) {
Üzerinde Adımla komutu, Adımla komutuna benzer, ancak geçerli deyim bir işlevi çağırırsa hata ayıklayıcı kodu işlevde ç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.
Uygulamanın aşağıdaki kod satırında duraklatması için F10'a bir kez daha basın.
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
Şu anda deyiminde duraklatılmış olan sarı işaretçiyi
if (num2 != 0)
seçin ve aşağıdaki deyime sürükleyin:result = num1 / num2;
İşaretçinin buraya sürüklenmesi uygulamanın deyimini tamamen atlamasına
if
neden olur, böylece sıfıra böldüğünüzde ne olduğunu görebilirsiniz.Kod satırını yürütmek için F10 tuşuna basın.
Değişkenin üzerine geldiğinizde
result
Sonsuz değeri gösterilir. C# dilinde Infinity, sıfıra böldüğünüzde elde edilen sonuç olur.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.
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:
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();
}
}
}
Program.cs dosyasının kodu da şu şekildedir:
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;
}
}
}
Tüm adımları tamamladıktan sonra CalculatorLibrary.cs dosyasının tam kodu aşağıdadır:
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 dosyasının kodu da şu şekildedir:
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;
}
}
}
Sonraki adımlar
Bu öğreticiyi tamamladıktan sonra tebrikler! Daha fazla bilgi edinmek için aşağıdaki içerikle devam edin:
- Daha fazla C# öğreticisi ile devam edin
- Hızlı Başlangıç: ASP.NET Core web uygulaması oluşturma
- Visual Studio'da C# kodunda hata ayıklamayı öğrenin
- Birim testleri oluşturma ve çalıştırma adımlarını gözden geçirme
- C# programı çalıştırma
- C# IntelliSense hakkında bilgi edinin
- Visual Studio IDE'ye genel bakış ile devam edin
- Günlüğe kaydetme ve izleme