如何找出某个变量所持有的数据类型?(例如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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
pho*_*oog 106
其他答案对这个问题提供了很好的帮助,但是有一个重要且微妙的问题,它们都没有直接解决.在C#中有两种考虑类型的方法:静态类型和运行时类型.
静态类型是源代码中变量的类型.因此它是一个编译时的概念.当您将鼠标悬停在开发环境中的变量或属性上时,这是您在工具提示中看到的类型.
运行时类型是内存中对象的类型.因此它是一个运行时概念.这是GetType()方法返回的类型.
对象的运行时类型通常不同于保存或返回它的变量,属性或方法的静态类型.例如,您可以使用以下代码:
object o = "Some string";
Run Code Online (Sandbox Code Playgroud)
变量的静态类型是object,但在运行时,变量的指示对象的类型是string.因此,下一行将"System.String"打印到控制台:
Console.WriteLine(o.GetType());
Run Code Online (Sandbox Code Playgroud)
但是,如果将鼠标悬停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));
Run Code Online (Sandbox Code Playgroud)
Dai*_*Dai 16
一般来说,除非你用反射或接口做某事,否则你几乎不需要进行类型比较.但是:
如果您知道要与之比较的类型,请使用is或as运算符:
if( unknownObject is TypeIKnow ) { // run code here
Run Code Online (Sandbox Code Playgroud)
该as运营商执行的是返回null如果失败,而不是异常的转换:
TypeIKnow typed = unknownObject as TypeIKnow;
Run Code Online (Sandbox Code Playgroud)
如果您不知道类型并且只想要运行时类型信息,请使用.GetType()方法:
Type typeInformation = unknownObject.GetType();
Run Code Online (Sandbox Code Playgroud)
在较新版本的C#中,您可以使用is运算符声明变量而无需使用as:
if( unknownObject is TypeIKnow knownObject ) {
knownObject.SomeMember();
}
Run Code Online (Sandbox Code Playgroud)
以前你必须这样做:
TypeIKnow knownObject;
if( (knownObject = unknownObject as TypeIKnow) != null ) {
knownObject.SomeMember();
}
Run Code Online (Sandbox Code Playgroud)
小智 13
它非常简单
variable.GetType().Name
Run Code Online (Sandbox Code Playgroud)
它将返回变量的数据类型
| 归档时间: |
|
| 查看次数: |
160202 次 |
| 最近记录: |