web-dev-qa-db-fra.com

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

Comment savoir quel type de données est stocké par une variable? (par exemple int, chaîne, caractère, 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;
        }
    }
}
67
Limeni

D'autres réponses apportent une aide précieuse à cette question, mais il existe un problème important et subtil qu'aucune d'entre elles 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 objet 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 objet 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 string";

Le type statique de la variable est object, mais au moment de l'exécution, le type de la variable referent est string. Par conséquent, la ligne suivante affichera "System.String" sur la console:

Console.WriteLine(o.GetType());

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

Pour les variables de type valeur, telles que int, double, System.Guid, vous savez que le type d'exécution sera toujours identique au type statique, car les types de valeur ne peuvent pas servir de classe de base pour un autre type; le type de valeur est le type le plus dérivé de sa chaîne d'héritage. Ceci 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.

Inversement, si le type statique de la variable est un type abstrait, il est alors 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));

// string is a sealed reference type
string s = "Foo";
// Prints True for any value of s
Console.WriteLine(s == null || s.GetType() == typeof(string));

// 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));
88
phoog

En règle générale, vous n'aurez pratiquement jamais besoin de faire de comparaisons de types, à moins que vous ne fassiez quelque chose avec réflexion ou interfaces. Toutefois:

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

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

L'opérateur as effectue une conversion qui renvoie la valeur null s'il échoue plutôt qu'une exception:

TypeIKnow typed = unknownObject as TypeIKnow;

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

Type typeInformation = unknownObject.GetType();

Dans les versions plus récentes de C #, vous pouvez utiliser l'opérateur is pour déclarer une variable sans avoir besoin d'utiliser as:

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

Auparavant, vous devriez faire ceci:

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

C'est très simple

variable.GetType().Name

il retournera votre type de données de votre variable

9
Sagar Chavan
4
Stephen Oberauer

Il suffit de maintenir le curseur sur le membre qui vous intéresse et de voir l'info-bulle - le type de membre est affiché:

enter image description here

4
Sergey Berezovskiy

Une option serait d'utiliser une méthode d'extension d'assistance comme suit:

public static class MyExtensions
{
    public static System.Type Type<T>(this T v)=>typeof(T);
}

var i=0;
console.WriteLine(i.Type().FullName);
1
Acerby

PHP et C # sont liés sur le plan syntaxique mais très différents, alors que je pourrais répondre à la question à sa valeur (voir cet article http://msdn.Microsoft.com/en-us/library/58918ffs(v=vs.71). aspx ) Je vous conseille vivement de vous procurer un exemplaire de CLR via C # (troisième ou deuxième édition) de Jeffrey Richter et de le lire. C’est le meilleur livre sur la programmation que j’ai jamais lu et qui répondrait à presque toutes vos questions liées au type et vous donnerait une compréhension très profonde de ce qui se passe sous le capot!

1
bUKaneer

GetType() méthode

int n=34;
Console.WriteLine(n.GetType());
string name="Smome";
Console.WriteLine(name.GetType());
0
Shyju

découvrez l'un des moyen simple de le faire

// Read string from console
        string line = Console.ReadLine(); 
        int valueInt;
        float valueFloat;
        if (int.TryParse(line, out valueInt)) // Try to parse the string 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 string.");
        }
0
KiranSolkar