¿Cómo puedo saber qué tipo de datos contiene alguna variable? (por ejemplo, int, string, char, etc.)
Tengo algo como esto ahora:
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;
}
}
}
int
class Person { public string Name { get; set; } }
oclass Person { private string m_Name; public string Name { get {return m_Name;} set { m_Name = value; } }
. Lea la documentación sobre PropiedadesRespuestas:
Hay un tema importante y sutil que ninguno de ellos aborda directamente. Hay dos formas de considerar el tipo en C #: tipo estático y tipo en tiempo de ejecución .
El tipo estático es el tipo de variable en su código fuente. Por tanto, es un concepto en tiempo de compilación. Este es el tipo que ve en una información sobre herramientas cuando pasa el cursor sobre una variable o propiedad en su entorno de desarrollo.
Puede obtener un tipo estático escribiendo un método genérico auxiliar para permitir que la inferencia de tipo se encargue de ello por usted:
El tipo de tiempo de ejecución es el tipo de un objeto en la memoria. Por tanto, es un concepto de tiempo de ejecución. Este es el tipo devuelto por el
GetType()
método.El tipo de tiempo de ejecución de un objeto suele ser diferente del tipo estático de la variable, propiedad o método que lo contiene o lo devuelve. Por ejemplo, puede tener un código como este:
El tipo estático de la variable es
object
, pero en tiempo de ejecución, el tipo de referencia de la variable esstring
. Por lo tanto, la siguiente línea imprimirá "System.String" en la consola:Pero, si pasa el cursor sobre la variable
o
en su entorno de desarrollo, verá el tipoSystem.Object
(o laobject
palabra clave equivalente ). También ve lo mismo usando nuestra función auxiliar desde arriba:Para las variables de tipo valor, tales como
int
,double
,System.Guid
, usted sabe que el tipo de tiempo de ejecución siempre será el mismo que el tipo estático, debido a los tipos de valor no pueden servir como clase base para otro tipo; se garantiza que el tipo de valor será el tipo más derivado en su cadena de herencia. Esto también es cierto para los tipos de referencia sellados: si el tipo estático es un tipo de referencia sellada, el valor de tiempo de ejecución debe ser una instancia de ese tipo onull
.Por el contrario, si el tipo estático de la variable es un tipo abstracto, se garantiza que el tipo estático y el tipo de tiempo de ejecución serán diferentes.
Para ilustrar eso en el código:
fuente
variable.getType()
devuelve el tipo de tiempo de ejecución (la mano de tipo lado derecho), pero lo que devuelve el tipo estático (la mano de tipo lado izquierdo de una variable)?typeof
para obtener un objeto de tipo en tiempo de ejecución para el tipo estático.typeof(a)
si lo hacetypeof(int)
, devolverá int, pero no está verificando la variable 'a' y le muestra el tipo de 'a'. Podría decir que no es necesario mostrar el tipo estático de 'a', eso puede ser así, pero el hecho es que no lo muestra. Entonces no veo cómo el uso de typeof aquí es útil.Type GetStaticType < T > (T x) { return typeof(T); }
switch
ahora admite la coincidencia de patrones para pruebas de tipo (de tipo de tiempo de ejecución, no estático). En lugar de activar el valor devuelto por GetType (), activa la variable directamente.Es muy simple
devolverá su tipo de datos de su variable
fuente
En términos generales, casi nunca necesitará hacer comparaciones de tipos a menos que esté haciendo algo con reflexión o interfaces. Sin embargo:
Si conoce el tipo con el que desea compararlo, use los operadores
is
oas
:El
as
operador realiza una conversión que devuelve nulo si falla en lugar de una excepción:Si no conoce el tipo y solo desea información sobre el tipo de tiempo de ejecución, use el método .GetType ():
En las versiones más recientes de C #, puede usar el
is
operador para declarar una variable sin necesidad de usaras
:Previamente tendrías que hacer esto:
fuente
Simplemente mantenga el cursor sobre el miembro que le interesa y vea la información sobre herramientas; mostrará el tipo de miembro:
fuente
Utilice el método GetType ()
http://msdn.microsoft.com/en-us/library/system.object.gettype.aspx
fuente
Una opción sería utilizar un método de extensión auxiliar como el siguiente:
fuente
GetType()
métodofuente
echa un vistazo a una de las formas sencillas de hacer esto
fuente