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