我怎样才能获得在C#中的variables的数据types?

我怎样才能找出某些variables持有的数据types? (如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; } } } 

其他的答案对这个问题提供了很好的帮助,但是有一个重要而微妙的问题,他们都没有直接处理。 在C#中有两种考虑types的方法: 静态types运行时types

静态types是源代码中的一个variables的types。 因此这是一个编译时间的概念。 当您将鼠标hover在开发环境中的variables或属性上时,这是您在工具提示中看到的types。

运行时types是内存中对象的types。 因此这是一个运行时间的概念。 这是GetType()方法返回的types。

对象的运行时types通常与保存或返回它的variables,属性或方法的静态types不同。 例如,你可以有这样的代码:

 object o = "Some string"; 

variables的静态types是object ,但是在运行时,variables所指对象的types是string 。 因此,下一行将打印“System.String”到控制台:

 Console.WriteLine(o.GetType()); 

但是,如果将鼠标hover在开发环境中的variableso上,则会看到typesSystem.Object (或等效的object关键字)。

对于值型variables,如intdoubleSystem.Guid ,您知道运行时types将始终与静态types相同,因为值types不能作为其他types的基类; 值types保证是inheritance链中派生最多的types。 对于密封引用types也是如此:如果静态types是密封的引用types,则运行时值必须是该types的实例或null

相反,如果variables的静态types是抽象types,那么保证静态types和运行时types是不同的。

为了说明在代码中:

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

一般来说,除非您使用reflection或界面进行操作,否则几乎不需要进行types比较。 但是:

如果您知道要与之比较的types,请使用isas操作符:

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

as运算符执行一个强制转换,如果失败而不是exception则返回null:

 TypeIKnow typed = unknownObject as TypeIKnow; 

如果您不知道types,只想要运行时types信息,请使用.GetType()方法:

 Type typeInformation = unknownObject.GetType(); 

它非常简单

 variable.GetType().Name 

它会返回你的variables的数据types

只要将光标hover在您感兴趣的会员身上,并看到工具提示 – 它将显示会员的types:

在这里输入图像说明

PHP和C#在语法上是相关的,但却完全不同,我可以用面值来回答这个问题(参见这篇文章http://msdn.microsoft.com/en-us/library/58918ffs(v=vs.71).aspx )我强烈build议您通过Jeffrey Richter的C#(第三版或第二版)获得CLR的副本,并阅读它。 它是与编程有关的最好的书,我想我已经阅读过,几乎可以回答所有types相关的问题,并给你一个非常深刻的理解。

GetType()方法

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

一种select是使用如下的辅助扩展方法:

 public static class MyExtensions { public static System.Type Type<T>(this T v)=>typeof(T); } var i=0; console.WriteLine(i.Type().FullName); 

检查一个简单的方法来做到这一点

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

通常,您不需要手动检查variables的types,因为您之前已经定义了它,编译器会为您检查它。