Qu'est-ce que le langage C# ? Qui l'a créé ? Quel est le rapport avec .NET ? Et puis, qu'est-ce que c'est .NET ?
Autant de questions auxquelles nous allons répondre maintenant.
Le C# ressemble beaucoup au Java dont il est inspiré, bien que les deux langages présentent des différences notables. Il reprend aussi certaines notions du C/C++ mais s'en démarque sensiblement.
Seul, il ne sert pas à grand chose. En effet, le langage a besoin d'une boîte à outils pour exécuter facilement des actions courantes, comme ouvrir un fichier, communiquer sur le réseau, ouvrir une fenêtre, réduire une fenêtre, accéder à une base de données, etc.
Cette boîte à outils, que l'on utilise quasi-systématiquement en C#, c'est le framework .NET. C'est un peu comme un énorme couteau suisse qui offre toutes les possibilités dont vous pouvez rêver.
Ce framework .NET n'est pas forcément lié au langage C#. Il est aussi possible de l'utiliser dans d'autres langages comme Visual Basic (plus simple, pour les programmeurs occasionnels), J# (plus proche de Java pour les habitués de Java) ou encore F# (langage fonctionnel).
Quelques langages permettant d'utiliser le framework .NET.
Les différentes couches du framework .NET.
Image 010.010.20100
On dit que .NET n'est pas une technologie mais un ensemble de technologies (c'est vous dire si c'est énorme en termes de possibilités !). Je me doute bien que "ensemble de technologies" ne vous dit pas concrètement ce qu'est .NET alors voici ces technologies ci-contre (cf. image 010.010.20100).
Tous ces mots techniques ne doivent pas vous effrayer, c'est normal de ne rien y comprendre pour le moment.
En revanche, il est intéressant de comprendre que .NET est divisé en plusieurs blocs (on parle debibliothèques) qui offrent chacun des services différents.
Vous voyez en particulier les WinForms qui sont les fenêtres graphiques d'un programme, ADO.NET qui permet d'utiliser des bases de données, et WPF qui est une franche amélioration des WinForms (notamment sur le plan du design).
C'est Microsoft qui est à l'origine du projet .NET et de son langage C#. En 2001, Anders Hejlsberg (le créateur du langage Delphi), employé chez Microsoft, crée le framework .NET (prononcé comme "dotte nette") et son langage phare : le C# (écrit C Sharp et prononcé comme "cé charpe"). Les deux sont complémentaires, comme nous allons le voir plus loin.
En 2002, la première version du .NET voit le jour et l'environnement de développement de Microsoft, Visual Studio, passe à la version 7.0 pour intégrer le .NET. S'ensuivent plusieurs versions importantes du framework .NET : 2.0, 3.0, 3.5, 4.0.
Actuellement, la dernière version du framework .NET est la 4.0, parue en avril 2010. Pour accompagner cette sortie, l'environnement de développement (le logiciel qui permet de programmer) a lui aussi évolué. Pour travailler en C#, .NET on utilise désormais Visual Studio 2010 (version 10.0). Les anciennes versions fonctionnent toujours mais il est recommandé de se mettre à jour.
Qu'est-ce que le langage C# ? Qui l'a créé ? Quel est le rapport avec .NET ? Et puis, qu'est-ce que c'est .NET ?
Image 010.010.20100
Exemple de programme : Paint .NET
Paint .NET est un éditeur d'images gratuit entièrement écrit à l'aide du framework .NET, dont voici un screenshot :
Paint .NET, éditeur d'images gratuit entièrement écrit à l'aide du framework .NET.
Image 010.010.20200
Vous pouvez d'ailleurs le télécharger sur le site de Paint .NET
Image 010.010.20200
À quoi ressemble le C# ?
Voici un code minimal qui affiche "Hello World!" :
using System;
class Program
{
public static void Main()
{
Console.WriteLine("Hello World!");
}
}
Nous aurons l'occasion de comprendre ce que tout cela veut dire plus loin.
Voici un code un peu plus long et complet qui gère (en partie) l'affichage d'une fenêtre, pour vous faire une idée. Je ne vous donne ce bout de code qu'à titre illustratif là encore :
region File Description
#
//-----------------------------------------------------------------------------
// MainForm.cs
//
// Microsoft XNA Community Game Platform
// Copyright (C) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
endregion
#
region Using Statements
#
using System;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
endregion
#
namespace WinFormsContentLoading
{
/// <summary>
/// Custom form provides the main user interface for the program.
/// In this sample we used the designer to fill the entire form with a
/// ModelViewerControl, except for the menu bar which provides the
/// "File / Open..." option.
/// </summary>
public partial class MainForm : Form
{
ContentBuilder contentBuilder;
ContentManager contentManager;
/// <summary>
/// Constructs the main form.
/// </summary>
public MainForm()
{
InitializeComponent();
contentBuilder = new ContentBuilder();
contentManager = new ContentManager(modelViewerControl.Services,
contentBuilder.OutputDirectory);
/// Automatically bring up the "Load Model" dialog when we are first shown.
this.Shown += OpenMenuClicked;
}
/// <summary>
/// Event handler for the Exit menu option.
/// </summary>
void ExitMenuClicked(object sender, EventArgs e)
{
Close();
}
/// <summary>
/// Event handler for the Open menu option.
/// </summary>
void OpenMenuClicked(object sender, EventArgs e)
{
OpenFileDialog fileDialog = new OpenFileDialog();
// Default to the directory which contains our content files.
string assemblyLocation = Assembly.GetExecutingAssembly().Location;
string relativePath = Path.Combine(assemblyLocation, "../../../../Content");
string contentPath = Path.GetFullPath(relativePath);
fileDialog.InitialDirectory = contentPath;
fileDialog.Title = "Load Model";
fileDialog.Filter = "Model Files (*.fbx;*.x)|*.fbx;*.x|" +
"FBX Files (*.fbx)|*.fbx|" +
"X Files (*.x)|*.x|" +
"All Files (*.*)|*.*";
if (fileDialog.ShowDialog() == DialogResult.OK)
{
LoadModel(fileDialog.FileName);
}
}
/// <summary>
/// Loads a new 3D model file into the ModelViewerControl.
/// </summary>
void LoadModel(string fileName)
{
Cursor = Cursors.WaitCursor;
// Unload any existing model.
modelViewerControl.Model = null;
contentManager.Unload();
// Tell the ContentBuilder what to build.
contentBuilder.Clear();
contentBuilder.Add(fileName, "Model", null, "ModelProcessor");
// Build this new model data.
string buildError = contentBuilder.Build();
if (string.IsNullOrEmpty(buildError))
{
// If the build succeeded, use the ContentManager to
// load the temporary .xnb file that we just created.
modelViewerControl.Model = contentManager.Load<Model>("Model");
}
else
{
// If the build failed, display an error message.
MessageBox.Show(buildError, "Error");
}
Cursor = Cursors.Arrow;
}
}
}
using System;
class Program
{
public static void Main()
{
Console.WriteLine("Hello World!");
}
}
region File Description
#
//-----------------------------------------------------------------------------
// MainForm.cs
//
// Microsoft XNA Community Game Platform
// Copyright (C) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
endregion
#
region Using Statements
#
using System;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
endregion
#
namespace WinFormsContentLoading
{
/// <summary>
/// Custom form provides the main user interface for the program.
/// In this sample we used the designer to fill the entire form with a
/// ModelViewerControl, except for the menu bar which provides the
/// "File / Open..." option.
/// </summary>
public partial class MainForm : Form
{
ContentBuilder contentBuilder;
ContentManager contentManager;
/// <summary>
/// Constructs the main form.
/// </summary>
public MainForm()
{
InitializeComponent();
contentBuilder = new ContentBuilder();
contentManager = new ContentManager(modelViewerControl.Services,
contentBuilder.OutputDirectory);
/// Automatically bring up the "Load Model" dialog when we are first shown.
this.Shown += OpenMenuClicked;
}
/// <summary>
/// Event handler for the Exit menu option.
/// </summary>
void ExitMenuClicked(object sender, EventArgs e)
{
Close();
}
/// <summary>
/// Event handler for the Open menu option.
/// </summary>
void OpenMenuClicked(object sender, EventArgs e)
{
OpenFileDialog fileDialog = new OpenFileDialog();
// Default to the directory which contains our content files.
string assemblyLocation = Assembly.GetExecutingAssembly().Location;
string relativePath = Path.Combine(assemblyLocation, "../../../../Content");
string contentPath = Path.GetFullPath(relativePath);
fileDialog.InitialDirectory = contentPath;
fileDialog.Title = "Load Model";
fileDialog.Filter = "Model Files (*.fbx;*.x)|*.fbx;*.x|" +
"FBX Files (*.fbx)|*.fbx|" +
"X Files (*.x)|*.x|" +
"All Files (*.*)|*.*";
if (fileDialog.ShowDialog() == DialogResult.OK)
{
LoadModel(fileDialog.FileName);
}
}
/// <summary>
/// Loads a new 3D model file into the ModelViewerControl.
/// </summary>
void LoadModel(string fileName)
{
Cursor = Cursors.WaitCursor;
// Unload any existing model.
modelViewerControl.Model = null;
contentManager.Unload();
// Tell the ContentBuilder what to build.
contentBuilder.Clear();
contentBuilder.Add(fileName, "Model", null, "ModelProcessor");
// Build this new model data.
string buildError = contentBuilder.Build();
if (string.IsNullOrEmpty(buildError))
{
// If the build succeeded, use the ContentManager to
// load the temporary .xnb file that we just created.
modelViewerControl.Model = contentManager.Load<Model>("Model");
}
else
{
// If the build failed, display an error message.
MessageBox.Show(buildError, "Error");
}
Cursor = Cursors.Arrow;
}
}
}