17 votes

Quelle est la différence entre une classe statique et un espace de noms? (en C#)

La seule différence que je vois est le fait que vous ne pouvez pas utiliser la déclaration "using staticClass".

Par conséquent, je me demande :

  1. Y a-t-il une réelle différence entre une classe statique et un espace de noms ?
  2. Existe-t-il une possibilité d'éviter de devoir réécrire le nom de la classe chaque fois qu'une fonction membre est appelée ? Je pense à quelque chose d'analogique à "using staticClass".

35voto

Mehrdad Afshari Points 204872

Oui, une classe static est techniquement un type. Elle peut avoir des membres (champs, méthodes, événements). Un espace de noms ne peut contenir que des types (et ce n'est pas considéré comme un "type" en soi; typeof(System) est une erreur de compilation).

Il n'y a pas d'équivalent direct pour ajouter une directive using pour un espace de noms d'une classe statique. Cependant, vous pouvez déclarer des alias :

using NomCourt = NomTresLongDeLaClasseStatique;

et utiliser

NomCourt.Membre

lorsque vous faites référence à ses membres.

De plus, vous pouvez utiliser des classes statiques pour déclarer des méthodes d'extension sur d'autres types et les utiliser directement sans faire référence explicitement au nom de la classe :

public static class IntExtensions {
   public static int Carré(this int i) { return i * i; }
}

et l'utiliser comme :

int i = 2;
int iAuCarre = i.Carré(); // notez que le nom de la classe n'est pas mentionné ici.

Bien sûr, vous devrez ajouter une directive using pour l'espace de noms contenant la classe pour utiliser la méthode d'extension si la classe n'est pas déclarée dans le namespace racine ou actuel.

7voto

George Polevoy Points 2751

La classe statique est quand même une classe. Elle peut contenir des méthodes, des propriétés, etc. L'espace de noms est simplement un espace de noms. C'est juste un outil pour distinguer entre les déclarations de classes ayant le même nom.

Une fonction ne peut pas exister dans un espace de noms seul, elle appartient à une classe.

Les extensions sont probablement ce que vous recherchez, si vous avez besoin d'une fonction statique sans mentionner le nom de la classe.

public static class MathExtensions
{
 public static int Square(this int x)
 {
  return x * x;
 }
}
//...
// var hundredSquare = 100.Square();

6voto

Une autre différence est que les espaces de noms peuvent couvrir plusieurs assemblages, alors que les classes ne le peuvent pas.

5voto

CesarGon Points 8710

Autant que je comprends, les espaces de noms sont une fonctionnalité de langage uniquement; ils sont supprimés par la compilation. En d'autres termes, le .NET runtime ne "voit" pas les espaces de noms, juste des noms de classes qui contiennent des points. Par exemple, la classe String dans l'espace de noms System est vue par le .NET runtime comme une classe nommée System.String, mais il n'y a pas de concept d'espace de noms du tout.

En revanche, les classes statiques sont entièrement comprises et gérées par le .NET runtime. Ce sont des types à part entière et vous pouvez utiliser la réflexion sur eux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X