Comment puis-je obtenir le type de données d’une variable en C #?

Comment puis-je savoir quel type de données est contenu dans une variable? (ex: int, ssortingng, char, etc.)

J’ai quelque chose comme ça maintenant:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Testing { class Program { static void Main() { Person someone = new Person(); someone.setName(22); int n = someone.getName(); Console.WriteLine(n.typeOf()); } } class Person { public int name; public void setName(int name) { this.name = name; } public int getName() { return this.name; } } } 

D’autres réponses apportent une aide précieuse à cette question, mais il existe un problème important et subtil qu’aucun d’entre eux n’aborde directement. Il existe deux manières de considérer le type en C #: type statique et type d’ exécution .

Le type statique est le type d’une variable dans votre code source. C’est donc un concept de compilation. C’est le type que vous voyez dans une info-bulle lorsque vous survolez une variable ou une propriété dans votre environnement de développement.

Le type d’exécution est le type d’un object en mémoire. C’est donc un concept d’exécution. C’est le type renvoyé par la méthode GetType() .

Le type d’exécution d’un object est souvent différent du type statique de la variable, de la propriété ou de la méthode qui le contient ou le renvoie. Par exemple, vous pouvez avoir un code comme celui-ci:

 object o = "Some ssortingng"; 

Le type statique de la variable est object , mais au moment de l’exécution, le type du référent de la variable est ssortingng . Par conséquent, la ligne suivante affichera “System.Ssortingng” sur la console:

 Console.WriteLine(o.GetType()); 

Mais si vous survolez la variable dans votre environnement de développement, vous verrez le type System.Object (ou le mot-clé d’ object équivalent).

Pour les variables de type valeur, telles que int , double , System.Guid , vous savez que le type d’exécution sera toujours le même que le type statique, car les types de valeur ne peuvent pas servir de classe de base pour un autre type. le type de valeur est garanti pour être le type le plus dérivé dans sa chaîne d’inheritance. Cela est également vrai pour les types de référence scellés: si le type statique est un type de référence scellé, la valeur d’exécution doit être une instance de ce type ou null .

À l’inverse, si le type statique de la variable est un type abstrait, il est garanti que le type statique et le type d’exécution seront différents.

Pour illustrer cela dans le code:

 // int is a value type int i = 0; // Prints True for any value of i Console.WriteLine(i.GetType() == typeof(int)); // ssortingng is a sealed reference type ssortingng s = "Foo"; // Prints True for any value of s Console.WriteLine(s == null || s.GetType() == typeof(ssortingng)); // object is an unsealed reference type object o = new FileInfo("C:\\f.txt"); // Prints False, but could be true for some values of o Console.WriteLine(o == null || o.GetType() == typeof(object)); // FileSystemInfo is an abstract type FileSystemInfo fsi = new DirectoryInfo("C:\\"); // Prints False for all non-null values of fsi Console.WriteLine(fsi == null || fsi.GetType() == typeof(FileSystemInfo)); 

En règle générale, vous n’aurez presque jamais besoin de faire des comparaisons de types, sauf si vous faites quelque chose avec des reflections ou des interfaces. Toutefois:

Si vous connaissez le type que vous souhaitez comparer, utilisez les opérateurs is ou as :

 if( unknownObject is TypeIKnow ) { // run code here 

L’opérateur as effectue un transtypage qui renvoie null s’il échoue plutôt qu’une exception:

 TypeIKnow typed = unknownObject as TypeIKnow; 

Si vous ne connaissez pas le type et que vous souhaitez simplement obtenir des informations sur le type d’exécution, utilisez la méthode .GetType ():

 Type typeInformation = unknownObject.GetType(); 

Dans les nouvelles versions de C #, vous pouvez utiliser l’opérateur is pour déclarer une variable sans avoir à utiliser as :

 if( unknownObject is TypeIKnow knownObject ) { knownObject.SomeMember(); } 

Auparavant, vous deviez le faire:

 TypeIKnow knownObject; if( (knownObject = unknownObject as TypeIKnow) != null ) { knownObject.SomeMember(); } 

C’est très simple

 variable.GetType().Name 

il retournera votre type de données de votre variable

Il suffit de maintenir le curseur sur le membre qui vous intéresse et de voir l’infobulle – il affichera le type de memeber:

entrer la description de l'image ici

PHP et C # sont liés sur le plan syntaxique, mais très différents, alors que je pourrais répondre à la question à la lettre (voir cet article http://msdn.microsoft.com/en-us/library/58918ffs(v=vs.71).aspx ). Je vous conseille vivement de vous procurer une copie de CLR via C # (troisième ou deuxième édition) de Jeffrey Richter et de la lire. C’est le plus beau livre en rapport avec la programmation, je crois que j’ai déjà lu et que je répondrais à presque toutes les questions liées à votre type et que vous compreniez très bien ce qui se passe sous le capot!

Une option serait d’utiliser une méthode d’extension d’aide comme suit:

 public static class MyExtensions { public static System.Type Type(this T v)=>typeof(T); } var i=0; console.WriteLine(i.Type().FullName); 

Méthode GetType()

 int n=34; Console.WriteLine(n.GetType()); ssortingng name="Smome"; Console.WriteLine(name.GetType()); 

Découvrez l’un des moyens simples de le faire

 // Read ssortingng from console ssortingng line = Console.ReadLine(); int valueInt; float valueFloat; if (int.TryParse(line, out valueInt)) // Try to parse the ssortingng as an integer { Console.Write("This input is of type Integer."); } else if (float.TryParse(line, out valueFloat)) { Console.Write("This input is of type Float."); } else { Console.WriteLine("This input is of type ssortingng."); } 

En règle générale, vous n’avez pas besoin de vérifier le type de la variable manuellement car vous l’avez déjà défini et le compilateur le vérifiera pour vous.