Kullanıcıdan Veri İstemek - Spectre Console Serisi
[[academy-video-youtube({"vid": "fmAClT_yr84", "start_time": "0", "title": "Kullanıcıdan Veri İsteği - Spectre Console Serisi", "creator": "Tim Corey", "length": "10m 10s"})]]
C# konsol uygulamaları, bir programın kullanıcıdan nasıl girdi okuduğunu ve çıktı gösterdiğini öğrenmenin her zaman en basit yoludur. Tim Corey, Spectre.Console serisinde, sıradan siyah-beyaz komut isteminin çok ötesine nasıl geçileceğini gösteriyor. Bu makalede, "Kullanıcıdan Veri İsteme - Spectre Console Serisi" videosunu yakından inceleyeceğiz ve nasıl girdi topladığını, sayısal değerleri nasıl işlediğini, hata kontrolü yaptığını ve programına daha kullanıcı dostu bir görünüm kazandırdığını göreceğiz — bunların hepsini şablon kodu elle değiştirmeden. Zaman damgaları, videodaki doğru noktaya atlamak için dahil edilmiştir.
Giriş: Komut Satırı Girişi Kolaylaştırıldı
Başlangıçta Tim, Spectre.Console'un sıradan C komut satırı girdisini görsel olarak çekici bir şeye dönüştürebileceğini hatırlatır. Console.ReadLine() ile standart girdiyi manuel olarak okumak, bunu ayrıştırmak ve istisnalarla başa çıkmak yerine, tam bir static void Main(string[] args) metodu yazmak yerine, Spectre.Console sizin için bunları halleder.
Tim'in sözleriyle (0:17), bu oturum "kullanıcıdan girdi isteme, verileri doğrulama ve uygun veri türüne dönüştürme" yöntemlerini gösterecek — bir konsol veya komut istemi ile çalışan herhangi bir geliştirici için temel bir beceri.
Ask ile Tamsayı Değerlerini Okuma
Tim'in ilk örneği (0:35) tanıdık bir konudur: kullanıcıya yaşını sormak. Geleneksel olarak C# dilinde şöyle yazardınız:
static void Main(string[] args)
{
Console.Write("Enter integer age: ");
string input = Console.ReadLine();
int age = int.Parse(input);
}static void Main(string[] args)
{
Console.Write("Enter integer age: ");
string input = Console.ReadLine();
int age = int.Parse(input);
}Bu, bir C# programının klasik giriş noktasını, ana fonksiyonu ve konsol üzerinden klavyeden bir giriş parametresi almayı gösterir. String girdisini int yaşa dönüştürmek için ayrıca int.Parse veya Convert.ToInt32 kullanmanız gerekir. Tim, geçersiz girdileri kendiniz ele almanız ve istisnaları atmanız veya yakalamanız gerektiğini belirtir.
Spectre.Console ile, basitçe yazar:
int age = AnsiConsole.Ask<int>("What is your age?");int age = AnsiConsole.Ask<int>("What is your age?");Bu tek satır, girişi okur, tamsayı değerine dönüştürür ve kullanıcı sayısal olmayan karakterler yazarsa kırmızı bir hata mesajı gösterir — ekstra hata kontrol kodu gerektirmez. Kullanıcı Enter tuşuna bastığında, yöntem girdiyi okur, sayısal bir tipe dönüştürür ve age değişkeninde saklar.
Boolean Giriş ve Neden Prompt Daha İyi
Sonraki (1:14) Tim, Boolean istemeyi gösteriyor:
bool isHappy = AnsiConsole.Ask<bool>("Are you happy?");bool isHappy = AnsiConsole.Ask<bool>("Are you happy?");Kullanıcı "true" veya "false" girerse, çalışır. Ama eğer "evet" yazarlarsa, Spectre.Console kırmızı bir hata gösterir. Bu, Ask<bool> veri türlerini otomatik olarak işlerken, kullanıcı girdileri için her zaman en doğal yöntem olmadığını gösterir.

Burası, Tim'in daha esnek bir API olan Prompt'a geçtiği yerdir; bu, özelleştirebileceğiniz bir mini sınıf gibi davranır.
Seçimler için TextPrompt Kullanma
3:02'de Tim, Ask'tan TextPrompt<string> ile Prompt'a geçiyor. Dahili Boolean yerine, kullanıcının gerçek seçimler yapabilmesini sağlayan bir metin isteminin yeni bir örneğini oluşturur:
var happyText = AnsiConsole.Prompt(
new TextPrompt<string>("Are you happy?")
.AddChoice("Yes")
.AddChoice("No"));var happyText = AnsiConsole.Prompt(
new TextPrompt<string>("Are you happy?")
.AddChoice("Yes")
.AddChoice("No"));Program çalıştığında (4:48), soru sonrasında konsolda [Yes/No] gösterecektir. Bu, kullanıcıya kabul edilebilir yanıtları kolayca görmesi için komut satırını süsleyen Spectre.Console'dur. Başka bir şey yazarsanız, yöntem onu alır, liste ile kontrol eder ve mevcut bir seçeneği seçmenizi söyleyen bir mesaj görüntüler.

Varsayılan Değer Ekleme
Tim daha sonra varsayılan bir değer ekler (5:16):
.DefaultValue("Yes").DefaultValue("Yes")Şimdi, program çalıştığında, kullanıcı sadece Enter tuşuna basabilir — bir metin olmadan satır sonu — ve yöntem otomatik olarak değişkene "Evet" atar. Bu, ana yönteminizde ek kod olmadan makul bir varsayılan değeri saklamak istediğinizde harikadır.
Doğrulama ile Tam Sayı İsteme
6:01'de Tim, tam sayı girişiyle daha zengin bir örnek gösteriyor. Yeni bir TextPrompt kullanarak tekrar yaş sormak için bir prompt oluşturuyor, ancak doğrulama mantığını direkt prompt içine ekliyor:
int age = AnsiConsole.Prompt(
new TextPrompt<int>("What is your age?")
.Validate(x =>
{
return x switch
{
< 0 => ValidationResult.Error("[red]You were not born yet[/]"),
> 120 => ValidationResult.Error("[red]You are too old[/]"),
_ => ValidationResult.Success(),
};
}));int age = AnsiConsole.Prompt(
new TextPrompt<int>("What is your age?")
.Validate(x =>
{
return x switch
{
< 0 => ValidationResult.Error("[red]You were not born yet[/]"),
> 120 => ValidationResult.Error("[red]You are too old[/]"),
_ => ValidationResult.Success(),
};
}));Burada komut istemi, standart giriş akışındaki dize değerlerini sayısal bir türe dönüştürmekle kalmayıp, aynı zamanda negatif yaşlara izin vermemek gibi iş kurallarına dayalı hata kontrolünü de gerçekleştiriyor. Tim bunu canlı olarak test ediyor (8:31): -1 girmek "Henüz doğmadınız." uyarısını tetikler. 150 girmek "Çok yaşlısınız." uyarısını tetikler. Sadece geçerli girdi programın bir sonraki satıra devam etmesine izin verir.

metodlarını
Sormak ve Yönlendirmek: Her İkisinin Ne Zaman Kullanılmalı
9:00'da Tim özetler:
- Ask: Hızlı ve basit. Programınızın yalnızca bir giriş parametresini okuyup bilinen bir türe dönüştürmesi gerektiğinde mükemmel.
Daha güçlü. Seçenekler, varsayılanlar ve doğrulamalar eklemenizi sağlar. Konsol uygulamanızı zenginleştirirken veya komut satırı argümanlarıyla yürütülebilir dosyanızı çağıran diğer programlarla entegre ederken harikadır.
Her iki yaklaşım da static void Main(string[] args) veya hatta public static void Main(string[] args) giriş noktasına hâlâ düzgün bir şekilde oturur. Program yürütüldüğünde geçirilen komut satırı argümanlarını okumak için args'a da erişebilir, bunu Spectre.Console istemleriyle birleştirebilir ve string.Format veya interpolasyon kullanarak düzgün biçimlendirilmiş bir dize çıkışı alabilirsiniz.
Konsol Geliştiricileri İçin Neden Önemlidir
Tim, bu yaklaşımın "kullanıcıdan bilgi isteme yeteneğinizi bir sonraki seviyeye taşıdığını" belirterek kapatıyor (9:19). Spectre.Console ile artık klavye girişini okumak, Convert sınıfı ile dönüştürmek ve varsayılan mesajları göstermek için tekrarlayan kod yazmıyorsunuz. Bunun yerine şunu alırsınız:
Komut isteminde renkli zengin çıktı.
- Sayısal türlerin, double değerlerin veya string değerlerin otomatik ayrıştırılması.
Geçersiz giriş için kullanıcı dostu hata işleme.
- Hibrit giriş modelleri için komut satırı argümanları ile komut istemlerini birleştirme yeteneği.
Bu, yeni başlayanlara ana yöntem, veri türleri ve giriş parametreleri hakkında öğretmeyi, Visual Studio veya herhangi bir başka editörde profesyonel düzeyde konsol uygulamaları yazarken bile daha kolay hale getirir.
Sonuç
Tim Corey'nin videodaki adım adım anlatımını takip ederek şunları öğrenirsiniz:
Spectre.Console'un Ask özelliğini kullanıcı girdisini okumak ve dönüştürmek için nasıl kullanacağınızı öğrenin.
- Seçenekler, varsayılanlar ve doğrulama sunmak için TextPrompt özelliğini nasıl kullanacağınızı öğrenin.
Main(string[] args) giriş noktanıza ve komut satırı argümanlarına bu istemlerin nasıl doğal bir şekilde uyduğunu.
- Hata kontrolü gereksiz kodlarını azaltmak ve komut satırı uygulamalarınızı daha kullanıcı dostu hale getirmek için nasıl yapabilirsiniz.
Tim'in gösterdiği her şey, komut istemcisi üzerinden çalıştırabileceğiniz, argümanlar iletebileceğiniz veya daha büyük Windows Forms uygulamalarına ya da araçlarına gömebileceğiniz tek bir yürütülebilir dosya olarak derlenir. Kullanıcıdan gelen girişi daha modern bir şekilde ele alırken, C# konsolunun ve ona aşina olunan ana fonksiyonunun sadeliğini korumanın modern bir yolu.

