Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Aplikasi berbasis file adalah program yang terkandung dalam satu *.cs file yang dibangun dan dijalankan tanpa file proyek (*.csproj) yang sesuai. Aplikasi berbasis file sangat ideal untuk mempelajari C# karena memiliki kompleksitas yang lebih sedikit: Seluruh program disimpan dalam satu file. Aplikasi berbasis file juga berguna untuk membangun utilitas baris perintah. Pada platform Unix, aplikasi berbasis file dapat dijalankan menggunakan #!arahan (shebang).
Di tutorial ini, Anda akan:
- Buat program berbasis file.
- Tambahkan dukungan Unix shebang (
#!). - Membaca argumen baris perintah.
- Menangani input standar.
- Tulis output seni ASCII.
- Memproses argumen baris perintah.
- Gunakan hasil baris perintah yang diurai.
- Uji aplikasi akhir.
Anda membangun program berbasis file yang menulis teks sebagai seni ASCII. Aplikasi ini terkandung dalam satu file, menggunakan paket NuGet yang mengimplementasikan beberapa fitur inti.
Prasyarat
- The .NET 10 SDK. Unduh dari situs unduhan .NET.
- Visual Studio Code. Unduh dari beranda Visual Studio Code.
- (Opsional) Ekstensi C# DevKit untuk Visual Studio Code. Unduh dari marketplace Visual Studio Code.
Membuat program berbasis file
Buka Visual Studio Code dan buat file baru bernama
AsciiArt.cs. Masukkan teks berikut:Console.WriteLine("Hello, world!");Simpan file tersebut. Kemudian, buka terminal terintegrasi di Visual Studio Code dan ketik:
dotnet run AsciiArt.cs
Pertama kali Anda menjalankan program ini, dotnet host membangun file yang dapat dieksekusi dari file sumber Anda, menyimpan artefak build di folder sementara, lalu menjalankan executable yang dibuat. Anda dapat memverifikasi pengalaman ini dengan mengetik dotnet run AsciiArt.cs lagi. Kali ini, dotnet host menentukan bahwa executable saat ini, dan menjalankan executable tanpa membangunnya lagi. Anda tidak melihat output build apa pun.
Langkah-langkah sebelumnya menunjukkan bahwa aplikasi berbasis file bukan file skrip. Mereka adalah file sumber C# yang dibangun menggunakan file proyek yang dihasilkan di folder sementara. Salah satu baris output yang ditampilkan ketika Anda membangun program akan terlihat seperti ini (di Windows):
AsciiArt succeeded (7.3s) → AppData\Local\Temp\dotnet\runfile\AsciiArt-85c58ae0cd68371711f06f297fa0d7891d0de82afde04d8c64d5f910ddc04ddc\bin\debug\AsciiArt.dll
Pada platform unix, folder output adalah sesuatu yang mirip dengan:
AsciiArt succeeded (7.3s) → Library/Application Support/dotnet/runfile/AsciiArt-85c58ae0cd68371711f06f297fa0d7891d0de82afde04d8c64d5f910ddc04ddc/bin/debug/AsciiArt.dll
Output tersebut memberi tahu Anda di mana file sementara dan output build ditempatkan. Sepanjang tutorial ini, kapan saja Anda mengedit file sumber, dotnet host memperbarui executable sebelum berjalan.
Aplikasi berbasis file adalah program C# reguler. Satu-satunya batasan adalah bahwa mereka harus ditulis dalam satu file sumber. Anda dapat menggunakan pernyataan tingkat atas atau metode klasik Main sebagai titik masuk. Anda dapat mendeklarasikan jenis apa pun: kelas, antarmuka, dan struktur. Anda dapat menyusun algoritma dalam program berbasis file sama seperti yang Anda lakukan dalam program C# apa pun. Anda bahkan dapat mendeklarasikan beberapa namespace layanan untuk mengatur kode Anda. Jika Anda menemukan program berbasis file yang tumbuh terlalu besar untuk satu file, Anda dapat mengonversinya ke program berbasis proyek dan membagi sumber menjadi beberapa file. Aplikasi berbasis file adalah alat prototipe yang bagus. Anda dapat mulai bereksperimen dengan overhead minimal untuk membuktikan konsep dan membangun algoritma.
Dukungan unix shebang (#!)
Nota
Dukungan untuk #! arahan hanya berlaku pada platform unix. Tidak ada direktif serupa bagi Windows untuk langsung menjalankan program C#. Pada Windows, Anda harus menggunakan dotnet run pada baris perintah.
Di unix, Anda dapat menjalankan aplikasi berbasis file secara langsung, mengetikkan nama file sumber pada baris perintah, bukan dotnet run. Anda perlu membuat dua perubahan:
Atur izin eksekusi pada file sumber:
chmod +x AsciiArt.csTambahkan arahan shebang (
#!) sebagai barisAsciiArt.cspertama file:#!/usr/local/share/dotnet/dotnet run
Lokasi dotnet dapat berbeda pada penginstalan unix yang berbeda. Gunakan perintah which dotnet untuk menemukan dotnet host di lingkungan Anda.
Atau, Anda dapat menggunakan #!/usr/bin/env dotnet untuk mengatasi jalur dotnet dari variabel lingkungan PATH secara otomatis:
#!/usr/bin/env dotnet
Setelah membuat dua perubahan ini, Anda dapat menjalankan program dari baris perintah secara langsung:
./AsciiArt.cs
Jika mau, Anda dapat menghapus ekstensi sehingga Anda dapat mengetik ./AsciiArt sebagai gantinya. Anda dapat menambahkan ke #! file sumber Anda meskipun Anda menggunakan Windows. Baris perintah Windows tidak mendukung #!, tetapi pengkompilasi C# memungkinkan arahan tersebut dalam aplikasi berbasis file di semua platform.
Membaca argumen baris perintah
Sekarang, tulis semua argumen pada baris perintah ke output.
Ganti konten
AsciiArt.cssaat ini dengan kode berikut:if (args.Length > 0) { string message = string.Join(' ', args); Console.WriteLine(message); }Anda dapat menjalankan versi ini dengan mengetik perintah berikut:
dotnet run AsciiArt.cs -- This is the command line.Opsi menunjukkan
--bahwa semua argumen perintah berikut harus diteruskan ke program AsciiArt. ArgumenThis is the command line.diteruskan sebagai array string, di mana setiap string adalah satu kata:This, ,is,thecommand, danline..
Versi ini menunjukkan konsep baru ini:
- Argumen baris perintah diteruskan ke program menggunakan variabel
argsyang telah ditentukan sebelumnya . Variabelargsadalah array string:string[]. Jika panjangnyaargsadalah 0, itu berarti tidak ada argumen yang disediakan. Jika tidak, setiap kata pada daftar argumen disimpan dalam entri yang sesuai dalam array. - Metode ini
string.Joinmenggabungkan beberapa string ke dalam satu string, dengan pemisah yang ditentukan. Dalam hal ini, pemisah adalah spasi tunggal. - Console.WriteLine menulis string ke konsol output standar, diikuti oleh baris baru.
Menangani input standar
Yang menangani argumen baris perintah dengan benar. Sekarang, tambahkan kode untuk menangani input pembacaan dari input standar (stdin) alih-alih argumen baris perintah.
Tambahkan klausa berikut
elseke pernyataan yangifAnda tambahkan dalam kode sebelumnya:else { while (Console.ReadLine() is string line && line.Length > 0) { Console.WriteLine(line); } }Kode sebelumnya membaca input konsol hingga baris kosong atau
nulldibaca. (Metode Console.ReadLine mengembalikannulljika aliran input ditutup dengan mengetik ctrl+C.)Uji membaca input standar dengan membuat file teks baru di folder yang sama. Beri nama file
input.txtdan tambahkan baris berikut:Hello from ... dotnet! You can create file-based apps in .NET 10 and C# 14 Have fun writing useful utilitiesJaga agar garis tetap pendek sehingga formatnya benar saat Anda menambahkan fitur untuk menggunakan seni ASCII.
Jalankan program lagi.
Dengan bash:
cat input.txt | dotnet run AsciiArt.csAtau, dengan PowerShell:
Get-Content input.txt | dotnet run AsciiArt.cs
Sekarang program Anda dapat menerima argumen baris perintah atau input standar.
Menulis output SENI ASCII
Selanjutnya, tambahkan paket yang mendukung seni ASCII, Colorful.Console. Untuk menambahkan paket ke program berbasis file, Anda menggunakan direktif #:package .
Tambahkan direktif berikut setelah direktif
#!dalam file AsciiArt.cs Anda:#:package Colorful.Console@1.2.15Penting
Versi
1.2.15adalah versi terbaru dariColorful.Consolepaket ketika tutorial ini terakhir diperbarui. Periksa halaman NuGet paket untuk versi terbaru untuk memastikan Anda menggunakan versi paket dengan perbaikan keamanan terbaru.Ubah baris yang memanggil
Console.WriteLineuntuk menggunakan metode sebagai gantinyaColorful.Console.WriteAscii:async Task WriteAsciiArt(AsciiMessageOptions options) { foreach (string message in options.Messages) { Colorful.Console.WriteAscii(message); await Task.Delay(options.Delay); } }Jalankan program, dan Anda melihat output seni ASCII alih-alih teks yang digaungkan.
Opsi perintah proses
Selanjutnya, mari kita tambahkan penguraian baris perintah. Versi saat ini menulis setiap kata sebagai baris output yang berbeda. Argumen baris perintah yang Anda tambahkan mendukung dua fitur:
Kutip beberapa kata yang harus ditulis pada satu baris:
AsciiArt.cs "This is line one" "This is another line" "This is the last line"--delayTambahkan opsi untuk menjeda di antara setiap baris:AsciiArt.cs --delay 1000
Pengguna harus dapat menggunakan kedua argumen bersama-sama.
Sebagian besar aplikasi baris perintah perlu mengurai argumen baris perintah untuk menangani opsi, perintah, dan input pengguna secara efektif.
System.CommandLine Pustaka menyediakan kemampuan komprehensif untuk menangani perintah, sub-perintah, opsi, dan argumen, memungkinkan Anda untuk berkonsentrasi pada apa yang dilakukan aplikasi Anda daripada mekanisme penguraian input baris perintah.
System.CommandLine Pustaka menawarkan beberapa manfaat utama:
- Pembuatan dan validasi teks bantuan otomatis.
- Dukungan untuk konvensi baris perintah POSIX dan Windows.
- Kemampuan penyelesaian tab bawaan.
- Perilaku penguraian yang konsisten di seluruh aplikasi.
System.CommandLineTambahkan paket. Tambahkan arahan ini setelah arahan paket yang ada:#:package System.CommandLine@2.0.0Penting
Versi
2.0.0ini adalah versi terbaru ketika tutorial ini terakhir diperbarui. Jika ada versi yang lebih baru yang tersedia, gunakan versi terbaru untuk memastikan Anda memiliki paket keamanan terbaru. Periksa halaman NuGet paket untuk versi terbaru untuk memastikan Anda menggunakan versi paket dengan perbaikan keamanan terbaru.Tambahkan yang diperlukan menggunakan pernyataan di bagian atas file Anda (setelah arahan
#!dan#:package):using System.CommandLine; using System.CommandLine.Parsing;Tentukan opsi penundaan dan argumen pesan. Tambahkan kode berikut untuk membuat
CommandLine.Optionobjek danCommandLine.Argumentuntuk mewakili opsi dan argumen baris perintah:Option<int> delayOption = new("--delay") { Description = "Delay between lines, specified as milliseconds.", DefaultValueFactory = parseResult => 100 }; Argument<string[]> messagesArgument = new("Messages") { Description = "Text to render." };Dalam aplikasi baris perintah, opsi biasanya dimulai dengan
--(tanda hubung ganda) dan dapat menerima argumen. Opsi--delaymenerima argumen bilangan bulat yang menentukan penundaan dalam milidetik. menentukanmessagesArgumentbagaimana token yang tersisa setelah opsi diurai sebagai teks. Setiap token menjadi string terpisah dalam array, tetapi teks dapat dikutip untuk menyertakan beberapa kata dalam satu token. Misalnya,"This is one message"menjadi token tunggal, sementaraThis is four tokensmenjadi empat token terpisah.Kode sebelumnya menentukan jenis argumen untuk
--delayopsi , dan bahwa argumen adalah arraystringnilai. Aplikasi ini hanya memiliki satu perintah, sehingga Anda menggunakan perintah root.Buat perintah akar dan konfigurasikan dengan opsi dan argumen. Tambahkan argumen dan opsi ke perintah root:
RootCommand rootCommand = new("Ascii Art file-based program sample"); rootCommand.Options.Add(delayOption); rootCommand.Arguments.Add(messagesArgument);Tambahkan kode untuk mengurai argumen baris perintah dan menangani kesalahan apa pun. Kode ini memvalidasi argumen baris perintah dan menyimpan argumen yang diurai System.CommandLine.ParseResult dalam objek:
ParseResult result = rootCommand.Parse(args); foreach (ParseError parseError in result.Errors) { Console.Error.WriteLine(parseError.Message); } if (result.Errors.Count > 0) { return 1; }
Kode sebelumnya memvalidasi semua argumen baris perintah. Jika validasi gagal, kesalahan ditulis ke konsol, dan aplikasi keluar.
Menggunakan hasil baris perintah yang diurai
Sekarang, selesaikan aplikasi untuk menggunakan opsi yang diurai dan tulis output. Pertama, tentukan rekaman untuk menahan opsi yang diurai. Aplikasi berbasis file dapat menyertakan deklarasi jenis, seperti rekaman dan kelas. Mereka harus setelah semua pernyataan tingkat atas dan fungsi lokal.
recordTambahkan deklarasi untuk menyimpan pesan dan nilai opsi penundaan:public record AsciiMessageOptions(string[] Messages, int Delay);Tambahkan fungsi lokal berikut sebelum deklarasi rekaman. Metode ini menangani argumen baris perintah dan input standar, dan mengembalikan instans rekaman baru:
async Task<AsciiMessageOptions> ProcessParseResults(ParseResult result) { int delay = result.GetValue(delayOption); List<string> messages = [.. result.GetValue(messagesArgument) ?? Array.Empty<string>()]; if (messages.Count == 0) { while (Console.ReadLine() is string line && line.Length > 0) { Colorful.Console.WriteAscii(line); await Task.Delay(delay); } } return new([.. messages], delay); }Buat fungsi lokal untuk menulis seni ASCII dengan penundaan yang ditentukan. Fungsi ini menulis setiap pesan dalam rekaman dengan penundaan yang ditentukan antara setiap pesan:
async Task WriteAsciiArt(AsciiMessageOptions options) { foreach (string message in options.Messages) { Colorful.Console.WriteAscii(message); await Task.Delay(options.Delay); } }Ganti klausa yang
ifAnda tulis sebelumnya dengan kode berikut yang memproses argumen baris perintah dan tulis output:var parsedArgs = await ProcessParseResults(result); await WriteAsciiArt(parsedArgs); return 0;
Anda membuat record jenis yang menyediakan struktur ke opsi dan argumen baris perintah yang diurai. Fungsi lokal baru membuat instans rekaman, dan menggunakan rekaman untuk menulis output seni ASCII.
Menguji aplikasi akhir
Uji aplikasi dengan menjalankan beberapa perintah yang berbeda. Jika Anda mengalami masalah, berikut adalah sampel yang sudah selesai untuk dibandingkan dengan apa yang Anda buat:
#!/usr/local/share/dotnet/dotnet run
#:package Colorful.Console@1.2.15
#:package System.CommandLine@2.0.0
using System.CommandLine;
using System.CommandLine.Parsing;
Option<int> delayOption = new("--delay")
{
Description = "Delay between lines, specified as milliseconds.",
DefaultValueFactory = parseResult => 100
};
Argument<string[]> messagesArgument = new("Messages")
{
Description = "Text to render."
};
RootCommand rootCommand = new("Ascii Art file-based program sample");
rootCommand.Options.Add(delayOption);
rootCommand.Arguments.Add(messagesArgument);
ParseResult result = rootCommand.Parse(args);
foreach (ParseError parseError in result.Errors)
{
Console.Error.WriteLine(parseError.Message);
}
if (result.Errors.Count > 0)
{
return 1;
}
var parsedArgs = await ProcessParseResults(result);
await WriteAsciiArt(parsedArgs);
return 0;
async Task<AsciiMessageOptions> ProcessParseResults(ParseResult result)
{
int delay = result.GetValue(delayOption);
List<string> messages = [.. result.GetValue(messagesArgument) ?? Array.Empty<string>()];
if (messages.Count == 0)
{
while (Console.ReadLine() is string line && line.Length > 0)
{
// <WriteAscii>
Colorful.Console.WriteAscii(line);
// </WriteAscii>
await Task.Delay(delay);
}
}
return new([.. messages], delay);
}
async Task WriteAsciiArt(AsciiMessageOptions options)
{
foreach (string message in options.Messages)
{
Colorful.Console.WriteAscii(message);
await Task.Delay(options.Delay);
}
}
public record AsciiMessageOptions(string[] Messages, int Delay);
Dalam tutorial ini, Anda belajar membangun program berbasis file, tempat Anda membangun program dalam satu file C#. Program ini tidak menggunakan file proyek, dan dapat menggunakan arahan #! pada sistem unix. Pelajar dapat membuat program ini setelah mencoba tutorial online kami dan sebelum membangun aplikasi berbasis proyek yang lebih besar. Aplikasi berbasis file juga merupakan platform yang bagus untuk utilitas baris perintah.