Как я могу получить тип данных переменной в С#?
Как узнать, какой тип данных хранится в переменной? (например, 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;
}
}
}
Ответы
Ответ 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
он вернет ваш тип данных вашей переменной
Ответ 4
Использовать метод GetType()
http://msdn.microsoft.com/en-us/library/system.object.gettype.aspx
Ответ 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
Обычно вам не нужно проверять тип переменной вручную, потому что вы определили ее раньше, и компилятор проверит ее для вас.