我该如何找出某个变量持有的数据类型?(例如:int、string、char等)
现在我有类似于以下的代码:
private static void Main()
{
var someone = new Person();
Console.WriteLine(someone.Name.typeOf());
}
public class Person
{
public int Name { get; set; }
}
GetType()
方法返回的类型。object o = "Some string";
变量的静态类型是 object
,但在运行时,变量的引用对象的类型是 string
。因此,下一行代码将在控制台上打印出 "System.String":
Console.WriteLine(o.GetType()); // prints System.String
然而,如果你在开发环境中悬停在变量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));
另一个用户编辑了这个答案,加入了下面评论中的一个通用助手方法,使用类型推断在运行时获取变量的静态类型引用,感谢typeof
:
Type GetStaticType<T>(T x) => typeof(T);
Console.WriteLine(GetStaticType(o)); // prints System.Object
但是这个函数在你想要保护自己免受重构的影响时,其实用处有限。当你写 GetStaticType
的调用时,你已经知道 o 的静态类型是 object。所以你可以直接写:
Console.WriteLine(typeof(object)); // also prints System.Object!
这让我想起了我刚开始工作时遇到的一些代码,类似于:
SomeMethod("".GetType().Name);
替代
SomeMethod("String");
variable.getType()
返回变量的运行时类型(即右侧类型),而静态类型(变量左侧的类型)会返回什么? - barloptypeof
在运行时获取静态类型的类型对象。 - phoogtypeof(a)
,如果您执行 typeof(int)
,它将返回int,但不会检查变量'a'并显示'a'的类型。您可以说您不需要显示'a'的静态类型,也许是这样的,但事实是它没有显示出来。所以我不明白在这里使用typeof的用处在哪里。 - barlopType GetStaticType < T > (T x) { return typeof(T); }
。请注意,这个代码片段已经是英文的,因此我只需将其翻译成中文并保持原意即可。 - phoogswitch
支持类型匹配以用于类型测试(针对运行时的类型而不是静态的)。你可以直接在变量上进行切换,而不是在GetType()返回的值上进行切换。 - phoog非常简单
variable.GetType().Name
它将返回您的变量的数据类型。
object o = "Hi!"; return o.GetType().Name;
返回的是 "String"
而不是 "Object"
。 - phoog一般来说,除非您正在使用反射或接口,否则几乎永远不需要进行类型比较。尽管如此:
如果您知道要与之比较的类型,请使用 is
或 as
运算符:
if( unknownObject is TypeIKnow ) { // run code here
< p > as
操作符执行转换,如果失败则返回 null 而不是异常: TypeIKnow typed = unknownObject as TypeIKnow;
如果您不知道类型,只想获取运行时类型信息,请使用 .GetType() 方法:
Type typeInformation = unknownObject.GetType();
在较新版本的C#中,您可以使用 is
运算符来声明变量,而无需使用 as
:
if( unknownObject is TypeIKnow knownObject ) {
knownObject.SomeMember();
}
以前你需要这样做:
TypeIKnow knownObject;
if( (knownObject = unknownObject as TypeIKnow) != null ) {
knownObject.SomeMember();
}
一种方法是使用辅助扩展方法,如下所示:
public static class MyExtensions
{
public static System.Type Type<T>(this T v) => typeof(T);
}
var i = 0;
console.WriteLine(i.Type().FullName);
Object.GetType
方法,这将完成任务。var test = (byte)1;
Console.WriteLine(test.GetType());
GetType()
方法
int n = 34;
Console.WriteLine(n.GetType());
string name = "Smome";
Console.WriteLine(name.GetType());
看看这个简单的方法之一
// 从控制台读取字符串
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.");
class Person { public string Name { get; set; } }
或者class Person { private string m_Name; public string Name { get {return m_Name;} set { m_Name = value; } } }
。请阅读关于属性的文档。 - Steve B