Tutorial: Menjelajahi ide menggunakan pernyataan tingkat atas untuk membangun kode sembari Anda belajar
Dalam tutorial ini, Anda akan mempelajari cara:
- Pelajari aturan yang mengatur penggunaan pernyataan tingkat atas.
- Gunakan pernyataan tingkat atas untuk menjelajahi algoritma.
- Lakukan refaktor eksplorasi ke dalam komponen yang dapat digunakan kembali.
Prasyarat
Anda harus mengatur komputer Anda untuk menjalankan .NET 6, yang mencakup kompiler C# 10. Pengompilasi C# 10 tersedia mulai dengan Visual Studio 2022 atau .NET 6 SDK.
Tutorial ini mengasumsikan Anda terbiasa dengan C# dan .NET, termasuk Visual Studio atau .NET CLI.
Mulai menjelajahi
Pernyataan tingkat atas memungkinkan Anda menghindari upacara tambahan yang diperlukan dengan menempatkan titik masuk program Anda dalam metode statis pada 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 yang baru. Hal itu memungkinkan Anda menghapus hanya 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 mengenai Templat C# baru menghasilkan pernyataan tingkat atas
.NET 6 SDK juga menambahkan serangkaian direktif implisitglobal using
untuk proyek yang menggunakan SDK berikut:
- Microsoft.NET.Sdk
- Microsoft.NET.Sdk.Web
- Microsoft.NET.Sdk.Worker
Direktif global using
implisit ini mencakup namespace layanan yang paling umum untuk jenis proyek.
Untuk informasi selengkapnya, lihat artikel tentang Implisit menggunakan direktif
Fitur ini menyederhanakan hal yang diperlukan untuk mulai menjelajahi ide-ide baru. Anda dapat menggunakan pernyataan tingkat atas untuk skenario pembuatan skrip atau untuk menjelajahinya. Setelah dasar-dasarnya berfungsi, Anda dapat mulai merefaktor kode dan membuat metode, kelas, atau rakitan lainnya untuk komponen yang dapat digunakan kembali yang telah 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 pada aplikasi Anda. Pengompilasi menghasilkan kesalahan jika Anda menggunakannya dalam lebih dari satu file.
Membangun mesin jawaban ajaib .NET
Untuk tutorial ini, mari kita buat aplikasi konsol yang menjawab pertanyaan "ya" atau "tidak" dengan jawaban acak. Anda akan membangun fungsionalitas selangkah demi selangkah. Anda dapat fokus pada tugas Anda alih-alih upacara yang diperlukan untuk struktur program biasa. Kemudian, setelah Anda senang dengan fungsionalitasnya, Anda dapat merefaktor aplikasi sesuai keinginan Anda.
Titik awal yang baik adalah menulis pertanyaan kembali ke konsol. Anda dapat mulai dengan menulis kode berikut:
Console.WriteLine(args);
Anda tidak mendeklarasikan variabel args
. Untuk file sumber tunggal yang berisi pernyataan tingkat atas Anda, pengompilasi mengenali args
yang berarti argumen baris perintah. Jenis argumen adalah string[]
, seperti dalam semua program C#.
Anda dapat menguji kode Anda 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
, karena itulah yang dicetak ke konsol:
System.String[]
Untuk menulis pertanyaan ke konsol, Anda harus menghitung argumen dan memisahkannya dengan spasi. Ganti panggilan WriteLine
Anda dengan kode berikut:
Console.WriteLine();
foreach(var s in args)
{
Console.Write(s);
Console.Write(' ');
}
Console.WriteLine();
Sekarang, ketika Anda menjalankan program, itu akan 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 dari kemungkinan jawaban:
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 sepuluh jawaban yang afirmatif, lima jawaban yang tidak berkomitmen, dan lima jawaban yang negatif. Berikutnya, 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 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 pernyataan using
ke bagian atas file sumber:
using System.Threading.Tasks;
Pernyataan using
harus ada sebelum pernyataan lain dalam file. Jika tidak, itu berarti kesalahan pengompilasi. Anda dapat menjalankan program lagi dan melihat animasi. Itu membuat pengalaman yang lebih baik. Bereksperimenlah dengan lamanya penundaan agar sesuai dengan selera Anda.
Kode sebelumnya membuat sekumpulan garis berputar yang dipisahkan oleh spasi. Menambahkan kata kunci await
menginstruksikan pengompilasi 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 harus 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 masuk akal. Berhasil. Tapi tidak dapat digunakan kembali. Sekarang setelah aplikasi berfungsi, saatnya untuk menarik bagian yang dapat digunakan kembali.
Salah satu kandidat adalah kode yang menampilkan animasi tunggu. Cuplikan itu dapat menjadi metode:
Anda dapat memulai dengan membuat fungsi lokal di file Anda. Ganti metode utama 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. Masih belum bisa digunakan kembali. Jadi, ekstraklah kode itu ke dalam kelas. Buat file 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 layanan 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:
foreach (string s in animations)
{
Console.Write(s);
await Task.Delay(50);
Console.Write("\b\b\b");
}
Sekarang Anda memiliki aplikasi lengkap, dan Anda telah merefaktor bagian yang dapat digunakan kembali untuk digunakan nanti. Anda dapat memanggil metode utilitas baru dari pernyataan tingkat atas Anda, seperti yang ditunjukkan di bawah ini 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 pernyataan tambahan using
.
Ringkasan
Pernyataan tingkat atas memudahkan pembuatan program sederhana untuk digunakan untuk menjelajahi algoritma baru. Anda dapat bereksperimen dengan algoritma dengan mencoba cuplikan kode yang berbeda. Setelah mempelajari hal yang berhasil, Anda dapat merefaktor kode agar lebih mudah dipelihara.
Pernyataan tingkat atas menyederhanakan program yang didasarkan pada aplikasi konsol. Ini termasuk fungsi Azure, tindakan GitHub, dan utilitas kecil lainnya. Untuk informasi selengkapnya, lihat Pernyataan tingkat atas (Panduan Pemrograman C#).