Bagikan melalui


Tutorial: Menjelajahi ide menggunakan pernyataan tingkat atas untuk membangun kode saat Anda belajar

Dalam tutorial ini, Anda mempelajari cara:

  • Pelajari aturan yang mengatur penggunaan pernyataan tingkat atas Anda.
  • Gunakan pernyataan tingkat atas untuk menjelajahi algoritma.
  • Mengubah struktur eksplorasi menjadi komponen-komponen yang dapat digunakan kembali.

Prasyarat

Anda perlu menyiapkan komputer Anda untuk menjalankan .NET 6 atau yang lebih baru. Pengkompilasi C# tersedia dimulai dengan Visual Studio 2022 atau .NET SDK.

Tutorial ini mengasumsikan Anda terbiasa dengan C# dan .NET, termasuk Visual Studio atau .NET CLI.

Mulai menjelajahi

Pernyataan tingkat atas memungkinkan Anda menghindari formalitas tambahan yang diperlukan dengan menempatkan titik masuk program Anda dalam metode statis di kelas. Titik awal umum untuk aplikasi konsol baru terlihat seperti kode berikut:

using System;

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

Kode sebelumnya adalah hasil dari menjalankan perintah dotnet new console dan membuat aplikasi konsol baru. 11 baris tersebut hanya berisi satu baris kode yang dapat dieksekusi. Anda dapat menyederhanakan program tersebut dengan fitur pernyataan tingkat atas baru. Itu memungkinkan Anda untuk menghapus semua kecuali dua baris dalam program ini:

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

Penting

Templat C# untuk .NET 6 menggunakan pernyataan tingkat atas. Aplikasi Anda mungkin tidak cocok dengan kode dalam artikel ini, jika Anda telah meningkatkan ke .NET 6. Untuk informasi selengkapnya, lihat artikel tentang templat C# baru menghasilkan pernyataan tingkat atas

.NET 6 SDK juga menambahkan sekumpulan direktif implisit untuk proyek yang menggunakan SDK berikut:

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

Arahan global using implisit ini mencakup namespace yang paling umum untuk jenis proyek.

Untuk informasi selengkapnya, lihat artikel tentang Implisit menggunakan arahan

Fitur ini menyederhanakan eksplorasi ide baru Anda. Anda dapat menggunakan pernyataan tingkat teratas untuk skenario skrip, atau untuk eksplorasi. Setelah dasar-dasar berfungsi, Anda dapat mulai merefaktor kode dan membuat metode, kelas, atau rakitan lainnya untuk komponen yang dapat digunakan kembali yang Anda buat. Pernyataan tingkat atas memang memungkinkan eksperimen cepat dan tutorial pemula. Mereka juga menyediakan jalur yang lancar dari eksperimen ke program penuh.

Pernyataan tingkat atas dijalankan dalam urutan muncul dalam file. Pernyataan tingkat atas hanya dapat digunakan dalam satu file sumber di aplikasi Anda. Pengkompilasi menghasilkan kesalahan jika Anda menggunakannya dalam lebih dari satu file.

Membangun mesin jawaban .NET ajaib

Untuk tutorial ini, mari kita buat aplikasi konsol yang menjawab pertanyaan "ya" atau "tidak" dengan jawaban acak. Anda membangun fungsionalitas langkah demi langkah. Anda dapat fokus pada tugas Anda daripada upacara yang diperlukan untuk struktur program umum. Kemudian, setelah Anda puas dengan fungsionalitas, Anda dapat merefaktor aplikasi sesuai keinginan Anda.

Titik awal yang baik adalah menulis pertanyaan kembali ke konsol. Anda dapat memulai dengan menulis kode berikut:

Console.WriteLine(args);

Anda tidak mendeklarasikan variabel args. Untuk file sumber tunggal yang berisi pernyataan tingkat atas Anda, pengkompilasi mengenali args berarti argumen baris perintah. Jenis args adalah string[], seperti dalam semua program C#.

Anda dapat menguji kode dengan menjalankan perintah dotnet run berikut:

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

Argumen setelah -- pada baris perintah diteruskan ke program. Anda dapat melihat jenis variabel args yang dicetak ke konsol:

System.String[]

Untuk menulis pertanyaan ke konsol, Anda perlu menghitung argumen dan memisahkannya dengan spasi. Ganti panggilan WriteLine dengan kode berikut:

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

Sekarang, ketika Anda menjalankan program, ia menampilkan pertanyaan dengan benar sebagai string argumen.

Merespons dengan jawaban acak

Setelah menggemakan pertanyaan, Anda dapat menambahkan kode untuk menghasilkan jawaban acak. Mulailah dengan menambahkan array jawaban yang mungkin:

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.",
];

Array ini memiliki 10 jawaban yang afirmatif, lima yang non-komittal, dan lima yang negatif. Selanjutnya, tambahkan kode berikut untuk menghasilkan dan menampilkan jawaban acak dari array:

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

Anda dapat menjalankan aplikasi lagi untuk melihat hasilnya. Anda akan melihat sesuatu seperti output berikut:

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.

Kode untuk menghasilkan jawaban mencakup deklarasi variabel dalam pernyataan tingkat atas Anda. Pengkompilasi memasukkan deklarasi tersebut dalam metode Main yang dihasilkan oleh kompilator. Karena deklarasi variabel ini adalah variabel lokal, Anda tidak dapat menyertakan pengubah static.

Kode ini menjawab pertanyaan, tetapi mari kita tambahkan satu fitur lagi. Anda ingin aplikasi pertanyaan Anda mensimulasikan pemikiran tentang jawabannya. Anda dapat melakukannya dengan menambahkan sedikit animasi ASCII, dan menjeda saat bekerja. Tambahkan kode berikut setelah baris yang menggemakan pertanyaan:

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

Anda juga perlu menambahkan direktif using ke bagian atas file sumber:

using System.Threading.Tasks;

Arahan using harus berada sebelum pernyataan lainnya dalam file. Jika tidak, ini adalah kesalahan kompilator. Anda dapat menjalankan program lagi dan melihat animasi. Itu membuat pengalaman yang lebih baik. Bereksperimenlah dengan panjang penundaan agar sesuai dengan selera Anda.

Kode sebelumnya membuat sekumpulan garis berputar yang dipisahkan oleh spasi. Menambahkan kata kunci await menginstruksikan pengkompilasi untuk menghasilkan titik masuk program sebagai metode yang memiliki pengubah async, dan mengembalikan System.Threading.Tasks.Task. Program ini tidak mengembalikan nilai, sehingga titik masuk program mengembalikan Task. Jika program Anda mengembalikan nilai bilangan bulat, Anda akan menambahkan pernyataan pengembalian ke akhir pernyataan tingkat atas Anda. Pernyataan pengembalian tersebut akan menentukan nilai bilangan bulat yang akan dikembalikan. Jika pernyataan tingkat atas Anda menyertakan ekspresi await, jenis pengembalian menjadi System.Threading.Tasks.Task<TResult>.

Pemfaktoran ulang untuk masa depan

Program Anda akan terlihat seperti kode berikut:

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]);

Kode sebelumnya wajar. Ini berhasil. Tapi itu tidak dapat digunakan kembali. Sekarang setelah aplikasi berfungsi, saatnya untuk menarik bagian yang dapat digunakan kembali.

Salah satu kandidat adalah kode yang menampilkan animasi menunggu. Cuplikan itu dapat menjadi metode:

Anda dapat memulai dengan membuat fungsi lokal dalam file Anda. Ganti animasi saat ini dengan kode berikut:

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

Kode sebelumnya membuat fungsi lokal di dalam metode utama Anda. Kode itu masih belum dapat digunakan kembali. Jadi, ekstrak kode itu ke dalam kelas. Buat file baru bernama utilities.cs dan tambahkan kode berikut:

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

File yang memiliki pernyataan tingkat atas juga dapat berisi namespace dan jenis di akhir file, setelah pernyataan tingkat atas. Tetapi untuk tutorial ini Anda menempatkan metode animasi dalam file terpisah untuk membuatnya lebih mudah digunakan kembali.

Terakhir, Anda dapat membersihkan kode animasi untuk menghapus beberapa duplikasi, dengan menggunakan perulangan foreach untuk melakukan iterasi melalui serangkaian elemen animasi yang ditentukan dalam array animations.
Metode ShowConsoleAnimation lengkap setelah refaktor akan terlihat mirip dengan kode berikut:

public static async Task ShowConsoleAnimation()
{
    string[] animations = ["| -", "/ \\", "- |", "\\ /"];
    for (int i = 0; i < 20; i++)
    {
        foreach (string s in animations)
        {
            Console.Write(s);
            await Task.Delay(50);
            Console.Write("\b\b\b");
        }
    }
    Console.WriteLine();
}

Sekarang Anda memiliki aplikasi lengkap, dan Anda merefaktor bagian yang dapat digunakan kembali untuk digunakan nanti. Anda dapat memanggil metode utilitas baru dari pernyataan tingkat atas Anda, seperti yang ditunjukkan dalam versi selesai program utama:

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]);

Contoh sebelumnya menambahkan panggilan ke Utilities.ShowConsoleAnimation, dan menambahkan direktif using lain.

Ringkasan

Pernyataan tingkat atas memudahkan untuk membuat program sederhana untuk digunakan untuk menjelajahi algoritma baru. Anda dapat bereksperimen dengan algoritma dengan mencoba cuplikan kode yang berbeda. Setelah Anda mempelajari apa yang berhasil, Anda dapat merefaktor kode agar lebih dapat dipertahankan.

Pernyataan tingkat atas menyederhanakan program yang didasarkan pada aplikasi konsol. Aplikasi ini mencakup fungsi Azure, tindakan GitHub, dan utilitas kecil lainnya. Untuk informasi selengkapnya, lihat Pernyataan tingkat atas (Panduan Pemrograman C#).