Как я могу получить тип данных переменной в C#?


Как я могу узнать, какой тип данных содержит некоторая переменная? (например, int, string, char и т. д.)

У меня есть что-то вроде этого сейчас:

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;
        }
    }
}
10 55

10 ответов:

другие ответы предлагают хорошую помощь в этом вопросе, но есть важный и тонкий вопрос, который ни один из них не обращается непосредственно. Существует два способа рассмотрения типа В C#:статического типа и тип.

статический тип-это тип переменной в исходном коде. Поэтому это концепция времени компиляции. Этот тип отображается во всплывающей подсказке при наведении указателя мыши на переменную или свойство в процессе разработки окружающая среда.

тип времени выполнения-это тип объекта в памяти. Поэтому это концепция времени выполнения. Это тип, возвращаемый GetType() метод.

тип времени выполнения объекта часто отличается от статического типа переменной, свойства или метода, который содержит или возвращает его. Например, вы можете иметь такой код:

object o = "Some string";

статический тип переменной object, но во время выполнения, тип переменной референт и string. Поэтому в следующей строке системы печати ".Строка " к консоли:

Console.WriteLine(o.GetType());

но, если вы наведете курсор на переменную o в вашей среде разработки, вы увидите типа System.Object (эквивалент object ключевое слово).

для переменных типа значения, таких как int,double,System.Guid, вы знаете, что тип времени выполнения всегда будет таким же, как и статический тип, потому что типы значений не могут служить базовым классом для другой тип; тип значения гарантированно является наиболее производным типом в цепочке наследования. Это также верно для запечатанных ссылочных типов: если статический тип является запечатанным ссылочным типом, значение времени выполнения должно быть либо экземпляром этого типа, либо null.

и наоборот, если статический тип переменной является абстрактным типом, то гарантируется, что статический тип и тип среды выполнения будут отличаться.

чтобы проиллюстрировать, что в код:

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

вообще говоря, вам вряд ли когда-нибудь понадобится делать сравнения типов, если вы не делаете что-то с отражением или интерфейсами. Тем не менее:

если вы знаете тип, с которым вы хотите сравнить его, используйте is или as операторы:

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

The as оператор выполняет приведение, которое возвращает null, если оно не выполняется, а не исключение:

TypeIKnow typed = unknownObject as TypeIKnow;

если вы не знаете тип и просто хотите получить информацию о типе среды выполнения, используйте .метод GetType() метод:

Type typeInformation = unknownObject.GetType();

в новых версиях C#, вы можете использовать is оператор для объявления переменной без необходимости использовать as:

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

ранее вы должны были бы сделать это:

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

очень просто

variable.GetType().Name

он вернет ваш тип данных вашей переменной

используйте метод GetType ()

http://msdn.microsoft.com/en-us/library/system.object.gettype.aspx

просто наведите курсор на интересующий вас элемент и посмотрите всплывающую подсказку-она покажет тип memeber:

enter image description here

PHP и C# связаны синтаксически, но совершенно разные, в то время как я мог бы ответить на вопрос по номиналу (см. Эту статью http://msdn.microsoft.com/en-us/library/58918ffs (v=vs.71). aspx ) я настоятельно рекомендую вам получить копию CLR через C# (третье или второе издание) Джеффри Рихтера и прочитать его. Его лучшая книга, связанная с программированием я думаю, что я когда-либо читал и ответил бы почти на все ваши вопросы, связанные с типом и дать вам очень глубокое понимание что происходит под капотом!

одним из вариантов было бы использовать вспомогательный метод расширения, как показано ниже:

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

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

GetType() метод

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

проверить один из простых способов сделать это

// 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.");
        }

Как правило, вам не нужно проверять тип переменной вручную, потому что вы определили его раньше, и компилятор проверит его для вас.