.NET中类型的定义

时间:2010-12-14 20:19:00

标签: c# .net vb.net

这个问题让我好奇...当你想要定义一个类型时,你必须说GetType(Type)例如:GetType(字符串),但字符串本身不是字符串吗?

为什么在这些情况下需要使用GetType?并且,如果原因是因为它期望类型'类型'...为什么不是转换隐含...我的意思是,所有数据都在那里......

4 个答案:

答案 0 :(得分:9)

您正在做的是获取对该类型的元数据的引用...如果您查看API的C#版本typeof(string),则可能会更加明显。 。返回一个Type对象,其中包含有关字符串类型的信息。

通常在使用反射或其他元编程技术时会这样做

答案 1 :(得分:3)

string是类型,int是类型,Type是类型,它们不相同。但是关于为什么没有隐式转换,MSDN不建议这样做:

  

通过消除不必要的演员阵容,   隐式转换可以改进   源代码可读性。然而,   因为隐式转换可能会发生   没有程序员的指定   他们必须小心谨慎   令人不快的惊喜。一般来说,   隐式转换运算符应该   从不抛出异常,永不丢失   信息,以便他们可以使用   没有程序员的安全   意识。如果是转换运算符   它应该不符合那些标准   明确标记。

注意:

  

永远不会丢失信息以便他们   可以安全使用,没有   程序员的意识

答案 2 :(得分:2)

  

如果要定义类型,必须说GetType(Type)ex。:GetType(string)...

那不是真的。每次执行以下任何操作

class MyClass
{
///...
}

class MyChildClass : MyClass
{
}

struct MyStruct
{
///...
}

您正在定义一种新类型。

  

如果原因是因为它期望类型'类型'...为什么不是转换隐含...我的意思是,所有数据都在那里......

这样做的一个原因是多态性。例如,如果允许我们执行以下操作:

MyChildClass x;

....GetType(x)

GetType(x)可以返回MyChildClassMyClassObject,因为x实际上是所有这些类型的实例。

值得注意的是Type本身就是一个类(即它继承自Object),所以你可以继承它。虽然我不确定你为什么要这样做而不是覆盖默认的反射行为(例如,隐藏内部的窥探)。

答案 3 :(得分:1)

GetType(string)将返回相同的信息。看它就像你会不变的那样。获取表示字符串的Type对象的唯一方法是实例化字符串对象并调用o.GetType()。此外,这对于接口和抽象类型是不可能的。

如果您想知道变量的运行时类型,请调用它的.GetType()方法,因为运行时类型可能与声明的变量类型不同。