Подтвердить что ты не робот

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

Как узнать, какой тип данных хранится в переменной? (например, 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;
        }
    }
}
4b9b3361

Ответ 1

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

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

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

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

object o = "Some string";

Статический тип переменной object, но во время выполнения тип референта переменной string. Поэтому следующая строка будет печатать "System.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));

Ответ 2

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

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

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

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

TypeIKnow typed = unknownObject as TypeIKnow;

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

Type typeInformation = unknownObject.GetType();

Ответ 3

Его очень простой

variable.GetType().Name

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

Ответ 5

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

enter image description here

Ответ 6

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

Ответ 7

GetType() метод

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

Ответ 8

Один из вариантов заключается в использовании вспомогательного метода расширения, например:

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

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

Ответ 9

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

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

Ответ 10

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