2010-12-14 8 views
2

Cette question me donne la curiosité ... Lorsque vous voulez définir un type, vous devez dire GetType (Type) ex .: GetType (chaîne), mais n'est pas un type de chaîne? Pourquoi avez-vous besoin d'utiliser GetType dans ces situations?Définition de type dans .NET

Pourquoi? Et, si la raison est parce qu'il attend un Type 'Type' ... pourquoi la conversion n'est-elle pas implicite ... Je veux dire, toutes les données sont là ...

Répondre

3

string est de type, int est de type et Type est le type et ils ne sont pas les mêmes. mais de savoir pourquoi il n'y a pas de conversion implicite, il est recommandé par MSDN:

En éliminant moulages inutiles, conversions implicites peuvent améliorer la lisibilité du code source. Cependant, car les conversions implicites peuvent se produire sans que le programmeur ne spécifie , il faut prendre soin d'éviter mauvaises surprises. En général, les opérateurs de conversion implicite ne devraient jamais jeter des exceptions et ne jamais perdre informations de sorte qu'ils puissent être utilisés en toute sécurité sans connaissance du programmeur . Si un opérateur de conversion ne peut pas répondre à ces critères, il doit être marqué explicitement .

Prenez attention à:

ne jamais perdre de l'information afin qu'ils peuvent être utilisés en toute sécurité sans la prise de conscience de programmeur

+0

type est un type est un type est un types ... désolé, ne pouvait pas l'aider :) –

+0

jajajajajaja. Désolé, je n'ai pas pu m'empêcher de rire ... – PedroC88

+0

@pedro_cesar, j'ai dit que pour vous aider mais si vous riez, je serai heureux de faire plaisir à quelqu'un :) –

9

Ce que vous faites c'est obtenir une référence aux méta-données du type ... cela peut être un peu plus évident si vous regardez la version C# de l'API, qui est typeof(string) ... qui renvoie un objet Type avec des informations sur le type de chaîne.

Vous généralement faire lors de l'utilisation de réflexion ou d'autres techniques

+0

+1 Une réponse correcte très concise! – gideon

+0

+ 1 Court et aussi le point. "J'aurais écrit une lettre plus courte si j'avais eu plus de temps" –

2

méta-programmation Lorsque vous souhaitez définir un type que vous devez dire GetType (type) ex .: GetType (string) ...

Ce n'est pas vrai. Chaque fois que vous effectuez l'une des actions suivantes

class MyClass 
{ 
///... 
} 

class MyChildClass : MyClass 
{ 
} 

struct MyStruct 
{ 
///... 
} 

vous définissez un nouveau type.

si la raison est parce qu'elle attend un type « type » ... pourquoi pas la conversion implicite ... Je veux dire, toutes les données sont là ...

One La raison en est le polymorphisme. Par exemple, si nous avons été autorisés à faire ce qui suit:

MyChildClass x; 

....GetType(x) 

GetType(x) pourrait revenir MyChildClass, MyClass ou Object, puisque x est vraiment une instance de tous ces types.

Il est également à noter que Type est lui-même une classe (c'est-à-dire qu'elle hérite de Object), vous pouvez donc en hériter. Bien que je ne sache pas pourquoi vous voudriez le faire autrement que de surcharger le comportement de réflexion par défaut (par exemple, pour cacher les internes des regards indiscrets).

1

GetType (string) retourne les mêmes informations. Regardez-le comme si vous étiez une constante. La seule autre façon d'obtenir l'objet Type qui représente une chaîne serait d'instancier l'objet chaîne et d'appeler o.GetType(). En outre, cela n'est pas possible pour les interfaces et les types abstraits. Si vous voulez connaître le type d'exécution d'une variable, appelez la méthode .GetType(), car le type d'exécution peut ne pas être le même que le type déclaré de la variable.

Questions connexes