L’app console .NET è il progetto più semplice che si può sviluppare tramite il linguaggio di programmazione C# e ci permette di scrivere la logica di un programma, software o applicativo. Quest’app provvede tutte le librerie necessarie per fare partire ed eseguire il nostro programma su un PC Windows o Linux.
E’ possibile creare un nuovo progetto di app console tramite VS Code, l’editor della Microsoft progettato per diversi sistemi operativi. Anche Visual Studio, l’IDE completo progettato per Windows permette di creare app console.
La presente guida è importante perché nei tutorial di questo sito verrà spesso utilizzato questo tipo di progetto per scrivere codice C#. Ogni volta che verrà spiegato la creazione di un programma o algoritmo si verrà rimandati qui se è la prima volta che si lavora con questo programma.
Vedi anche: Come installare e usare Visual Studio Code
Come creare un’app console
Per creare un nuovo progetto, bisogna aprire VS Code e cliccare su Visualizza – Riquadro comandi; successivamente cliccare su .NET: nuovo progetto e infine su App console. Apparirà il riquadro per scegliere la cartella dove posizionare il progetto. Poi bisogna assegnargli un nome e il progetto sarà pronto.
Il seguente video mostra i passaggi da effettuare:
Il progetto avrà già delle cartelle e dei file pronti:
- La cartella bin contiene i file già compilati e il file eseguibile per gli utenti. In questo momento, poiché non ci sono istruzioni che dicono al programma di attendere l’input dell’utente, la console verrà chiusa automaticamente;
- La cartella obj contiene le istruzioni per fare compilare e testare il nostro progetto e non va toccato.
- Il file Program.cs è il file principale dove scriviamo le istruzioni principali del programma.
Aggiungi il seguente codice e fai partire il programma come mostrato nel video:
//Qui viene scritto il codice
Console.WriteLine("Premi un tasto per chiudere il programma");
Console.ReadLine();
Adesso il programma verrà chiuso soltanto quando premeremo un tasto.
Possiamo creare qualunque cartella vogliamo e aggiungere qualsiasi file C#. L’importante è che colleghiamo le classi e le istruzioni principali al file Program. Ad esempio, se vogliamo creare una rubrica potremmo creare una cartella chiamata Contatti e due file, una per la classe Contatto, una per gestire la lista dei contatti e un’altra per i menu. Ecco del semplice codice di esempio per le singole classi:
class Contatto(string nome, string? cognome, int numero)
{
public string Nome { get; set; } = nome;
public string? Cognome { get; set; } = cognome;
public int Numero { get; set; } = numero;
public override string ToString()
{
return $"Nome: {Nome}, Cognome: {Cognome}, Numero: {Numero}";
}
}
Dopo avere creato una struttura per i contatti è importante potere salvare i contatti in un file in modo da poterli recuperare anche nel caso in cui chiudiamo il programma. Usiamo il formato JSON.
class GestioneDati<T>(string percorsoJSON)
{
private readonly string _percorsoJSON = percorsoJSON;
public List<T> CaricaDati() {
if (File.Exists(_percorsoJSON))
{
string json = File.ReadAllText(_percorsoJSON);
if (!string.IsNullOrEmpty(json))
{
List<T>? dati = JsonSerializer.Deserialize<List<T>>(json);
if (dati is not null)
{
return dati;
} else {
return [];
}
}
}
return [];
}
public void SalvaDati(List<T> dati) {
string json = JsonSerializer.Serialize(dati);
File.WriteAllText(_percorsoJSON, json);
}
}
Adesso creiamo una lista contatti e le funzioni per aggiungere, modificare, cercare e cancellare gli elementi:
class GestioneContatti
{
public GestioneDati<Contatto> gestioneDati;
public List<Contatto> ListaContatti { get; set; }
public GestioneContatti() {
gestioneDati = new GestioneDati<Contatto>("contatti.json");
ListaContatti = gestioneDati.CaricaDati();
}
public void AggiungiContatto(string nome, int numero)
{
Contatto nuovoContatto = new(nome, numero);
ListaContatti.Add(nuovoContatto);
AggiornaDati();
}
private void AggiornaDati()
{
gestioneDati.SalvaDati(ListaContatti);
}
public void EliminaContatto(Contatto contatto_da_cancellare) {
ListaContatti.Remove(contatto_da_cancellare);
AggiornaDati();
}
public static void MostraContatto(Contatto contatto) {
Console.WriteLine($"Nome: {contatto.Nome}, Numero: {contatto.Numero}");
}
public void MostraTuttiIContatti() {
foreach (Contatto contatto in ListaContatti)
{
MostraContatto(contatto);
}
}
/// <summary>
/// Cerca un contatto per nome o numero di telefono e lo mostra se trovato.
/// </summary>
/// <param name="valoreDaCercare">Il nome o il numero di telefono del contatto da cercare.</param>
public Contatto? CercaContatto(string valoreDaCercare) {
foreach (Contatto contatto in ListaContatti)
{
if (contatto.Nome.Equals(valoreDaCercare, StringComparison.CurrentCultureIgnoreCase) || contatto.Numero.ToString() == valoreDaCercare)
{
MostraContatto(contatto);
return contatto;
}
}
Console.WriteLine("Contatto non trovato");
return null;
}
}
Infine creiamo il menu che permette all’utente di creare la sua lista contatti:
class MenuPrincipale
{
public GestioneContatti gestioneContatti;
public MenuPrincipale() {
gestioneContatti = new GestioneContatti();
}
public int ApriMenu()
{
Console.WriteLine("Contatti");
Console.WriteLine("1. Aggiungi contatto");
Console.WriteLine("2. Mostra contatti");
Console.WriteLine("3. Cerca contatto");
Console.WriteLine("4. Esci");
Console.Write("Digita il numero per il comando corrispondente: ");
string? scelta = Console.ReadLine();
switch (scelta)
{
case "1":
AggiungiContatto();
break;
case "2":
MostraContatti();
break;
case "3":
CercaContatto();
break;
case "4":
Console.WriteLine("Uscita...");
return 0;
}
Console.WriteLine();
return 1;
}
public void AggiungiContatto() {
Console.Write("Inserisci nome del contatto: ");
string? nome = Console.ReadLine();
Console.Write("Inserisci numero del contatto: ");
if (int.TryParse(Console.ReadLine(), out int numero))
{
if (nome is not null)
gestioneContatti.AggiungiContatto(nome, numero);
Console.WriteLine($"Aggiungo {nome} con numero: {numero}");
}
else
{
Console.WriteLine("Numero non valido");
}
}
public void MostraContatti() {
gestioneContatti.MostraTuttiIContatti();
}
public Contatto? CercaContatto(string valoreDaCercare) {
Contatto? contatto = gestioneContatti.CercaContatto(valoreDaCercare);
if (contatto is not null)
{
return contatto;
}
return null;
}
public void EliminaContatto(Contatto contatto) {
gestioneContatti.EliminaContatto(contatto);
}
public void CercaContatto()
{
Console.Write("Inserisci nome o numero da cercare: ");
string? valoreDaCercare = Console.ReadLine();
if (valoreDaCercare is not null)
{
Contatto? contatto = gestioneContatti.CercaContatto(valoreDaCercare);
Console.WriteLine("1. Elimine (E), 2. Indietro (I)");
string? scelta = Console.ReadLine();
if (scelta is not null && contatto is not null)
{
switch (scelta)
{
case "E":
EliminaContatto(contatto);
break;
case "I":
//Torna Indietro
break;
}
}
}
}
}
In Program.cs scriveremo soltanto:
MenuPrincipale menu = new();
while (true)
{
int programma = menu.ApriMenu();
if (programma == 0) {
return;
}
}
NET app console con Visual Studio
Visual Studio è un potente IDE, un ambiente di sviluppo integrato per progettare software. In questo caso dobbiamo seguire un procedimento simile: cliccare su Crea progetto, selezionare il linguaggio C# e Console come tipo di progetto. Dobbiamo selezionare il primo suggerimento perché è il progetto più aggiornato e compatibile anche con i sistemi macOS e Linux.
Anche in questo caso il file principale sarà molto semplice: a differenza delle vecchie versioni adesso non è necessario avere la struttura di un file C# ma possiamo usare direttamente le istruzioni di primo livello. L’unica differenza rispetto a VS Code è che possiamo scegliere il tipo di file da creare: classe, interfacce; tuttavia il primo editor è più leggero. Perciò ognuno di questi programmi ha i suoi vantaggi.