Öğretici: Öğrenirken kod oluşturmak için üst düzey deyimleri kullanarak fikirleri keşfetme

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Üst düzey deyimleri kullanımınızı yöneten kuralları öğrenin.
  • Algoritmaları keşfetmek için üst düzey deyimleri kullanın.
  • Keşifleri yeniden kullanılabilir bileşenler halinde yeniden düzenleme.

Ön koşullar

Makinenizi C# 10 derleyicisini içeren .NET 6'yı çalıştıracak şekilde ayarlamanız gerekir. C# 10 derleyicisi Visual Studio 2022 veya .NET 6 SDK'sı ile başlayarak kullanılabilir.

Bu öğreticide, Visual Studio veya .NET CLI dahil olmak üzere C# ve .NET hakkında bilgi sahibi olduğunuz varsayılır.

Keşfetmeye başlayın

Üst düzey deyimler, programınızın giriş noktasını bir sınıftaki statik bir yönteme yerleştirerek gereken ek seremoniyi önlemenizi sağlar. Yeni konsol uygulaması için tipik başlangıç noktası aşağıdaki koda benzer:

using System;

namespace Application
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

Yukarıdaki kod, komutu çalıştırmanın ve yeni bir konsol uygulaması oluşturmanın dotnet new console sonucudur. Bu 11 satır yalnızca bir yürütülebilir kod satırı içerir. Yeni üst düzey deyimler özelliğiyle bu programı basitleştirebilirsiniz. Bu, bu programdaki iki satır dışında tüm satırları kaldırmanızı sağlar:

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

Önemli

.NET 6 için C# şablonları en üst düzey deyimleri kullanır. .NET 6'ya zaten yükselttiyseniz uygulamanız bu makaledeki kodla eşleşmeyebilir. Daha fazla bilgi için Yeni C# şablonları en üst düzey deyimleri oluşturma makalesine bakın

.NET 6 SDK'sı, aşağıdaki SDK'ları kullanan projeler için bir dizi örtükglobal using yönerge de ekler:

  • Microsoft.NET.Sdk
  • Microsoft.NET.Sdk.Web
  • Microsoft.NET.Sdk.Worker

Bu örtük global using yönergeler, proje türü için en yaygın ad alanlarını içerir.

Daha fazla bilgi için Örtük kullanım yönergeleri makalesine bakın

Bu özellik, yeni fikirleri keşfetmeye başlamak için gerekenleri basitleştirir. Betik senaryoları için veya araştırmak için üst düzey deyimleri kullanabilirsiniz. Temel bilgileri çalışmaya başladıktan sonra kodu yeniden düzenlemeye başlayabilir ve oluşturduğunuz yeniden kullanılabilir bileşenler için yöntemler, sınıflar veya diğer derlemeler oluşturabilirsiniz. Üst düzey deyimler hızlı denemelere ve başlangıç öğreticilerine olanak tanır. Ayrıca denemelerden tam programlara kadar sorunsuz bir yol sağlarlar.

Üst düzey deyimler, dosyada göründükleri sırayla yürütülür. Üst düzey deyimler uygulamanızdaki yalnızca bir kaynak dosyada kullanılabilir. Derleyici, bunları birden fazla dosyada kullanırsanız bir hata oluşturur.

Sihirli bir .NET yanıt makinesi oluşturma

Bu öğretici için rastgele bir yanıtla "evet" veya "hayır" sorularını yanıtlayan bir konsol uygulaması oluşturalım. İşlevselliği adım adım oluşturacaksınız. Tipik bir programın yapısı için gereken tören yerine görevinize odaklanabilirsiniz. Ardından, işlevden memnun olduğunuzda uygulamayı uygun gördüğünüz şekilde yeniden düzenleyebilirsiniz.

Soruyu konsola geri yazmak iyi bir başlangıç noktasıdır. Başlangıç olarak aşağıdaki kodu yazabilirsiniz:

Console.WriteLine(args);

Değişken bildirmezsiniz args . En üst düzey deyimlerinizi içeren tek kaynak dosya için, derleyici komut satırı bağımsız değişkenlerini ifade ettiğini tanır args . Args türü, tüm C# programlarında olduğu gibi bir string[]şeklindedir.

Aşağıdaki dotnet run komutu çalıştırarak kodunuzu test edebilirsiniz:

dotnet run -- Should I use top level statements in all my programs?

Komut satırından -- sonraki bağımsız değişkenler programa geçirilir. Değişkenin args türünü görebilirsiniz, çünkü konsolda yazdırılan budur:

System.String[]

Soruyu konsola yazmak için bağımsız değişkenleri listelemeniz ve bir boşlukla ayırmanız gerekir. Çağrıyı WriteLine aşağıdaki kodla değiştirin:

Console.WriteLine();
foreach(var s in args)
{
    Console.Write(s);
    Console.Write(' ');
}
Console.WriteLine();

Şimdi, programı çalıştırdığınızda, soruyu doğru bir bağımsız değişken dizesi olarak görüntüler.

Rastgele bir yanıtla yanıt verme

Soruyu yankıladıktan sonra, rastgele yanıtı oluşturmak için kodu ekleyebilirsiniz. Başlangıç olarak olası yanıtlardan oluşan bir dizi ekleyin:

string[] answers =
[
    "It is certain.",       "Reply hazy, try again.",     "Don’t count on it.",
    "It is decidedly so.",  "Ask again later.",           "My reply is no.",
    "Without a doubt.",     "Better not tell you now.",   "My sources say no.",
    "Yes – definitely.",    "Cannot predict now.",        "Outlook not so good.",
    "You may rely on it.",  "Concentrate and ask again.", "Very doubtful.",
    "As I see it, yes.",
    "Most likely.",
    "Outlook good.",
    "Yes.",
    "Signs point to yes.",
];

Bu dizide olumlu on yanıt, committal olmayan beş yanıt ve negatif olan beş yanıt vardır. Ardından, diziden rastgele bir yanıt oluşturmak ve görüntülemek için aşağıdaki kodu ekleyin:

var index = new Random().Next(answers.Length - 1);
Console.WriteLine(answers[index]);

Sonuçları görmek için uygulamayı yeniden çalıştırabilirsiniz. Aşağıdaki çıkışa benzer bir şey görmeniz gerekir:

dotnet run -- Should I use top level statements in all my programs?

Should I use top level statements in all my programs?
Better not tell you now.

Bu kod soruları yanıtlar, ancak bir özellik daha ekleyelim. Soru uygulamanızın yanıt hakkında düşünme simülasyonu oluşturmasını istiyorsunuz. Bunu yapmak için biraz ASCII animasyonu ekleyebilir ve çalışırken duraklatabilirsiniz. Soruyu yankılayan satırın arkasına aşağıdaki kodu ekleyin:

for (int i = 0; i < 20; i++)
{
    Console.Write("| -");
    await Task.Delay(50);
    Console.Write("\b\b\b");
    Console.Write("/ \\");
    await Task.Delay(50);
    Console.Write("\b\b\b");
    Console.Write("- |");
    await Task.Delay(50);
    Console.Write("\b\b\b");
    Console.Write("\\ /");
    await Task.Delay(50);
    Console.Write("\b\b\b");
}
Console.WriteLine();

Ayrıca kaynak dosyanın en üstüne bir using deyim eklemeniz gerekir:

using System.Threading.Tasks;

Deyimler using , dosyadaki diğer deyimlerden önce olmalıdır. Aksi takdirde, bu bir derleyici hatasıdır. Programı yeniden çalıştırabilir ve animasyonu görebilirsiniz. Bu daha iyi bir deneyim sağlar. Zevkinize uygun gecikme süresiyle denemeler yapın.

Yukarıdaki kod, boşlukla ayrılmış bir dizi dönen çizgi oluşturur. anahtar sözcüğünü await eklemek, derleyiciye program giriş noktasını değiştiriciye sahip bir yöntem olarak oluşturmasını async ve bir System.Threading.Tasks.Taskdöndürür. Bu program bir değer döndürmez, bu nedenle program giriş noktası bir Taskdöndürür. Programınız bir tamsayı değeri döndürürse, en üst düzey deyimlerinizin sonuna bir return deyimi eklersiniz. Bu return deyimi, döndürülecek tamsayı değerini belirtir. En üst düzey deyimleriniz bir await ifade içeriyorsa, dönüş türü olur System.Threading.Tasks.Task<TResult>.

Gelecek için yeniden düzenleme

Programınız aşağıdaki kod gibi görünmelidir:

Console.WriteLine();
foreach(var s in args)
{
    Console.Write(s);
    Console.Write(' ');
}
Console.WriteLine();

for (int i = 0; i < 20; i++)
{
    Console.Write("| -");
    await Task.Delay(50);
    Console.Write("\b\b\b");
    Console.Write("/ \\");
    await Task.Delay(50);
    Console.Write("\b\b\b");
    Console.Write("- |");
    await Task.Delay(50);
    Console.Write("\b\b\b");
    Console.Write("\\ /");
    await Task.Delay(50);
    Console.Write("\b\b\b");
}
Console.WriteLine();

string[] answers =
[
    "It is certain.",       "Reply hazy, try again.",     "Don't count on it.",
    "It is decidedly so.",  "Ask again later.",           "My reply is no.",
    "Without a doubt.",     "Better not tell you now.",   "My sources say no.",
    "Yes – definitely.",    "Cannot predict now.",        "Outlook not so good.",
    "You may rely on it.",  "Concentrate and ask again.", "Very doubtful.",
    "As I see it, yes.",
    "Most likely.",
    "Outlook good.",
    "Yes.",
    "Signs point to yes.",
];

var index = new Random().Next(answers.Length - 1);
Console.WriteLine(answers[index]);

Yukarıdaki kod makuldür. İşe yarıyor. Ama yeniden kullanılamaz. Artık uygulamayı çalıştırdığınıza göre, artık yeniden kullanılabilir parçaları çekmenin zamanı geldi.

Adaylardan biri, bekleyen animasyonu görüntüleyen koddur. Bu kod parçacığı bir yönteme dönüşebilir:

Dosyanızda yerel bir işlev oluşturarak başlayabilirsiniz. Geçerli animasyonu aşağıdaki kodla değiştirin:

await ShowConsoleAnimation();

static async Task ShowConsoleAnimation()
{
    for (int i = 0; i < 20; i++)
    {
        Console.Write("| -");
        await Task.Delay(50);
        Console.Write("\b\b\b");
        Console.Write("/ \\");
        await Task.Delay(50);
        Console.Write("\b\b\b");
        Console.Write("- |");
        await Task.Delay(50);
        Console.Write("\b\b\b");
        Console.Write("\\ /");
        await Task.Delay(50);
        Console.Write("\b\b\b");
    }
    Console.WriteLine();
}

Yukarıdaki kod, ana yönteminizin içinde yerel bir işlev oluşturur. Bu hala yeniden kullanılamaz. Bu nedenle, bu kodu bir sınıfa ayıklayın. utilities.cs adlı yeni bir dosya oluşturun ve aşağıdaki kodu ekleyin:

namespace MyNamespace
{
    public static class Utilities
    {
        public static async Task ShowConsoleAnimation()
        {
            for (int i = 0; i < 20; i++)
            {
                Console.Write("| -");
                await Task.Delay(50);
                Console.Write("\b\b\b");
                Console.Write("/ \\");
                await Task.Delay(50);
                Console.Write("\b\b\b");
                Console.Write("- |");
                await Task.Delay(50);
                Console.Write("\b\b\b");
                Console.Write("\\ /");
                await Task.Delay(50);
                Console.Write("\b\b\b");
            }
            Console.WriteLine();
        }
    }
}

Üst düzey deyimleri olan bir dosya, en üst düzey deyimlerden sonra dosyanın sonunda ad alanları ve türler de içerebilir. Ancak bu öğreticide animasyon yöntemini daha kolay yeniden kullanılabilir hale getirmek için ayrı bir dosyaya yerleştirmiş olursunuz.

Son olarak, bazı yinelemeleri kaldırmak için animasyon kodunu temizleyebilirsiniz:

foreach (string s in animations)
{
    Console.Write(s);
    await Task.Delay(50);
    Console.Write("\b\b\b");
}

Artık eksiksiz bir uygulamanız var ve yeniden kullanılabilir bölümleri daha sonra kullanmak üzere yeniden düzenlediniz. Ana programın tamamlanmış sürümünde aşağıda gösterildiği gibi üst düzey deyimlerinizden yeni yardımcı program yöntemini çağırabilirsiniz:

using MyNamespace;

Console.WriteLine();
foreach(var s in args)
{
    Console.Write(s);
    Console.Write(' ');
}
Console.WriteLine();

await Utilities.ShowConsoleAnimation();

string[] answers =
[
    "It is certain.",       "Reply hazy, try again.",     "Don’t count on it.",
    "It is decidedly so.",  "Ask again later.",           "My reply is no.",
    "Without a doubt.",     "Better not tell you now.",   "My sources say no.",
    "Yes – definitely.",    "Cannot predict now.",        "Outlook not so good.",
    "You may rely on it.",  "Concentrate and ask again.", "Very doubtful.",
    "As I see it, yes.",
    "Most likely.",
    "Outlook good.",
    "Yes.",
    "Signs point to yes.",
];

var index = new Random().Next(answers.Length - 1);
Console.WriteLine(answers[index]);

Yukarıdaki örnek çağrısı ekler Utilities.ShowConsoleAnimationve ek using bir deyim ekler.

Özet

Üst düzey deyimler, yeni algoritmaları keşfetmek için basit programlar oluşturmayı kolaylaştırır. Farklı kod parçacıkları deneyerek algoritmalarla denemeler yapabilirsiniz. Neyin işe yaradığını öğrendikte kodu daha sürdürülebilir olacak şekilde yeniden düzenleyebilirsiniz.

Üst düzey deyimler, konsol uygulamalarını temel alan programları basitleştirir. Bunlar Azure işlevlerini, GitHub eylemlerini ve diğer küçük yardımcı programları içerir. Daha fazla bilgi için bkz . Üst düzey deyimler (C# Programlama Kılavuzu).