39 votes

Qu'est-ce que System.Void?

Je sais que les méthodes déclarées avec void ne retourne rien.

Mais il semble qu'en C# void est plus alors seulement un mot-clé, mais un type réel.
void est un alias pour System.Void comme int est System.Int32.

Pourquoi ne suis-je pas autorisé à utiliser ce type? Il ne fait aucun sens, mais ce sont juste quelques pensées à propos de la logique.

Ni

var nothing = new System.Void();

(qui dit que je doit utiliser void (et Non un alias?))
ni

var nothing = new void();

compile.

Il n'est pas possible d'utiliser quelque chose comme ça:

void GiveMeNothing() { }
void GiveMeNothingAgain()
{
    return GiveMeNothing();
}

Ainsi quel est le point de System.Void?

41voto

Jon Points 194296

À partir de la documentation:

L' Void structure est utilisée dans le System.Reflection d'espace de noms, mais il est rarement utile dans un cadre typique application. L' Void structure n'a pas de les membres autres que ceux de tous les types hériter de l' Object classe.

Il n'y a pas de raison vraiment à l'utiliser dans le code.

Aussi:

var nothing = new void();

Ce n'est pas compilé pour moi. Qu'entendez-vous en disant qu'il "fonctionne"?

Mise à jour:

Une méthode void Foo() ne retourne rien. System.Void est là, alors que si vous demandez (par Réflexion) "quel est le type de la valeur de retour de cette méthode?", vous pouvez obtenir la réponse typeof(System.Void). Il n'y a pas de raison technique, il ne pouvait pas rentrer null au lieu de cela, mais ce serait introduire un cas particulier dans la Réflexion de l'API, et les cas particuliers sont à éviter si possible.

Enfin, il n'est pas légal pour un programme visant à contenir l'expression typeof(System.Void). Cependant, c'est un compilateur de l'exécution de restriction, pas un CLR une. En effet, si vous essayez de l'autorisés typeof(void) et regarder sa valeur dans le débogueur, vous verrez que c'est la même valeur, il serait si typeof(System.Void) étaient légales.

18voto

Danny Chen Points 14781

void / System.Void est différent de int / System.Int32 , c'est une structure spéciale en C #, utilisée uniquement pour la réflexion. Voir cet exemple:

 class Program
{
   public static void Main(string[] args)
   {
      Type voidType = typeof(Program).GetMethod("Main").ReturnType;
   }
}
 

Il doit y avoir un type utilisé pour décrire le type de retour de la méthode Main ici, c'est pourquoi nous avons le System.Void .

9voto

llewellyn falco Points 669

Nous avons utilisé le code suivant

 public Type GetType(object o)
{
    var type = o == null ? typeof(void) : o.GetType();
}
 

Afin que nous puissions utiliser le modèle d'objet nul. C'est plutôt bon. Cela nous permet de faire des choses comme

 GetType(o).GetProperties().Select( .....
 

au lieu de mettre des clauses de garde partout

7voto

Marc Gravell Points 482669

Au-delà de ne pas renvoyer de valeur, très peu de définition est donnée de void (bien que void* attire l'attention) dans la spécification de langue. Ce n'est pas vraiment un problème de langue - bien que la CLI puisse le définir plus en détail.

En fin de compte cependant: parce que cela n'a pas de sens de faire new void()

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