我怎样才能获得在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,如int
, double
, System.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,请使用is
或as
操作符:
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,因为您之前已经定义了它,编译器会为您检查它。