#format wiki
#LANGUAGE it
<<BR>>
<<Indice>>
<<Informazioni(forum="https://forum.ubuntu-it.org/viewtopic.php?f=46&t=651540"; rilasci="20.04 22.04 24.04")>> 

= Introduzione =

'''C#''' (pronunciato «''C sharp''»), è un linguaggio di programmazione orientato agli oggetti sviluppato da Microsoft per la piattaforma .NET (pronunciato «''dot net''»). Le specifiche del linguaggio sono state standardizzate dalla ECMA (European Computer Manufacturers Association).<<BR>>
Si ispira ai linguaggi C/C++ e Java, ma rispetto a questi integra diverse nuove caratteristiche e miglioramenti:
 * tutto è un oggetto;
 * possibilità di utilizzare i puntatori, ma solo in particolari zone di codice definite ''unsafe'';
 * sono consentite solo conversioni implicite, dove non ci sia perdita di dati;
 * è possibile ereditare da una sola classe (come in Java);
 * overloading degli operatori;
 * presenza di ''namespace'' al posto dei ''package'' di Java.

Per programmare in '''C#''' su GNU/Linux è ancora disponibile il framework [[https://www.mono-project.com/|Mono]], un'implementazione libera e multi-piattaforma di Microsoft .NET. Tuttavia è generalmente considerato ormai superato, in quanto corrisponde al .NET Framework 4.x.<<BR>>
La soluzione attualmente consigliata è '''[[https://docs.microsoft.com/it-it/dotnet/core/introduction|.NET]]''', piattaforma gratuita, multipiattaforma e open source.

= Installazione di .NET =

È possibile installare:
 * '''.NET''' con il solo '''Runtime''' per eseguire applicazioni
 * '''.NET [[https://it.wikipedia.org/wiki/Software_development_kit|SDK]]''' necessario per sviluppare e comprensivo del '''Runtime'''

In entrambi i casi seguire le istruzioni di [[https://learn.microsoft.com/it-it/dotnet/core/install/linux-ubuntu|questa guida]]. 

{{{#!wiki note
A partire da Ubuntu 22.04, .NET è incluso nei [[Repository#Repository_ufficiali|repository ufficiali]] (chiamati «feed di gestione pacchetti» nella guida Microsoft).
}}}

Per verificare la versione SDK installata digitare nel [[AmministrazioneSistema/Terminale|terminale]] il seguente comando:{{{
dotnet --list-sdks
}}}
L'output sarà simile al seguente {{{
8.0.112 [/usr/lib/dotnet/sdk]
}}}

Per verificare la versione del runtime installato:{{{
dotnet --list-runtimes
}}}
L'output sarà simile al seguente {{{
Microsoft.AspNetCore.App 8.0.12 [/usr/lib/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 8.0.12 [/usr/lib/dotnet/shared/Microsoft.NETCore.App]
}}}

= Strumenti per lo sviluppo =

Un progetto .NET è composto da una molti file. Quindi si consiglia di utilizzare un IDE orientato allo sviluppo (ad esempio '''[[https://www.jetbrains.com/rider/|JetBrains Rider]]''', proprietario e a pagamento) oppure un editor avanzato (ad esempio '''[[Ufficio/EditorDiTesto/VisualStudioCode|VisualStudioCode]]''', con licenza libera e gratuita).

= Creare un'applicazione console .NET senza utilizzare un IDE =

 0. Creare una cartella `TestHelloWorld` nella propria '''Home'''.
 0. Aprire un [[AmministrazioneSistema/Terminale|terminale]] e spostarsi in questa cartella.
 0. Digitare il seguente comando: {{{
dotnet new console --use-program-main
}}}
 In questo modo verranno creati diversi file. Il file di codice `Program.cs` conterrà le seguenti righe: {{{#!cplusplus
namespace TestHelloWorld;
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello, World!");
    }
}
}}}
 0. Eseguire il seguente comando: {{{
dotnet run
}}}
 Il risultato sarà:{{{
Hello, World!
}}}

Per ulteriori informazioni consultare [[https://learn.microsoft.com/it-it/dotnet/core/tutorials/with-visual-studio-code?pivots=dotnet-6-0|questa pagina]].

= Creazione di un'applicazione con GUI in VisualStudioCode =

Prerequisiti:
 * per sviluppare in C#, deve essere installata l'estensione '''[[https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp|C#]]''' (normalmente l'editor propone di installarla quando si apre un file C#); per installare le estensioni di '''!VisualStudioCode''' nel '''VS Code Extension Marketplace''' consultare [[https://code.visualstudio.com/docs/editor/extension-gallery|questa guida]].
 * per creare una GUI si deve utilizzare un framework a scelta, come [[https://learn.microsoft.com/it-it/dotnet/maui/what-is-maui?view=net-maui-7.0|MAUI]] (per Linux viene sviluppato dalla comunità), [[https://platform.uno/|Uno]], [[https://avaloniaui.net/|AvaloniaUI]] o [[https://github.com/GtkSharp/GtkSharp|GtkSharp]]. Nell'esempio successivo verrà usato quest'ultimo.

Seguire la procedura descritta di seguito.

 0. Nel terminale di '''!VisualStudioCode''' eseguire il seguente comando per installare il template:{{{
dotnet new --install GtkSharp.Template.CSharp
}}}
 0. Controllare che il template sia presente con il seguente comando:{{{
dotnet new --list | grep gtkapp
}}}
 Se tutto è corretto, l'output sarà il seguente:{{{
Gtk Application             gtkapp          [C#]        Gtk/GUI App
}}} 
 0. Selezionare dal menù principale '''''File → Apri cartella'''''. 
 0. Nella finestra di dialogo '''Apri cartella''' creare una cartella `TestGUI` e selezionarla. 
 0. Fare quindi clic su '''Aprire'''. Per impostazione predefinita il nome della cartella diventerà il nome e il ''namespace'' del progetto.
 0. Nel terminale eseguire il seguente comando: {{{
dotnet new gtkapp
}}}
 Verranno creati diversi file, tra cui `MainWindow.glade`, che è il file di descrizione del form da modificare successivamente con [[Programmazione/Python/Glade|Glade]]. Il file `MainWindow.cs` mostra come integrare i file `.glade` in un progetto e come gestire gli eventi: {{{#!cplusplus
using System;
using Gtk;
using UI = Gtk.Builder.ObjectAttribute;

namespace TestGUI
{
    class MainWindow : Window
    {
        [UI] private Label _label1 = null;
        [UI] private Button _button1 = null;

        private int _counter;

        public MainWindow() : this(new Builder("MainWindow.glade")) { }

        private MainWindow(Builder builder) : base(builder.GetRawOwnedObject("MainWindow"))
        {
            builder.Autoconnect(this);

            DeleteEvent += Window_DeleteEvent;
            _button1.Clicked += Button1_Clicked;
        }

        private void Window_DeleteEvent(object sender, DeleteEventArgs a)
        {
            Application.Quit();
        }

        private void Button1_Clicked(object sender, EventArgs a)
        {
            _counter++;
            _label1.Text = "Hello World! This button has been clicked " + _counter + " time(s).";
        }
    }
}
}}}

Per avviare l'applicazione, basterà eseguire nel terminale:{{{
dotnet run
}}}
Il risultato sarà una finestra con il testo «`Hello World!`» al centro e un pulsante «'''Click me!'''» in basso.

= Pubblicazione =

Per la distribuzione di una applicazione, '''.NET''' permette di pubblicare una versione standalone che include il runtime .NET o una versione più leggera senza il runtime (in questo caso l'utente dovrà installare il runtime sul suo PC).

Per ulteriori informazioni consultare [[https://learn.microsoft.com/it-it/dotnet/core/deploying/|questa pagina]].

= Script =

Consultare [[Programmazione/CSharp/Script|questa guida]].

= Esempi =

Per gli utenti desiderosi di approfondimento, in [[/Listati|questa pagina]] vengono proposti degli esempi di programmi scritti in '''C#''' a difficoltà crescente.

= Risoluzione dei problemi =

[[https://learn.microsoft.com/it-it/dotnet/core/install/linux-package-mixup|Questa pagina]] della documentazione ufficiale Microsoft contiene soluzioni e link relativi a diversi problemi, fra cui errori relativi ai comandi:{{{
dotnet new
dotnet run
}}}


= Ulteriori risorse =

 * [[https://learn.microsoft.com/it-it/dotnet/csharp/|Documentazione Microsoft per C#]]
 * [[https://learn.microsoft.com/it-it/dotnet/fundamentals/|Documentazione Microsoft .NET]]
 * [[http://www.csharphelp.com/|C# Help]] (consigli su C#)
 * [[http://www.c-sharpcorner.com/|C# Corner]] (consigli su C#)
 * [[http://visualcsharp.it/default.aspx|Comunità italiana di sviluppo con C# e .NET]]
 * [[http://www.mono-project.com/Main_Page|Sito ufficiale del progetto Mono]]

----
CategoryProgrammazione