如何在C#中找到某些结构(值类型)或类(引用类型)

时间:2012-02-01 07:03:10

标签: c# visual-studio class types struct

我正在使用某人的SDK,但该文档没有告诉我某个结构或类。

我怎么知道呢? typeofGetType只显示名称。

我想在IDE(VS2010)中找到它;通过编码的方法也是可以接受的。

2 个答案:

答案 0 :(得分:7)

从编程上讲,您可以使用GetType().IsValueType

在Visual Studio中,您还可以使用对象浏览器进行检查(如下所示,位于View - >对象浏览器下)。

object browser

答案 1 :(得分:-1)

如上所述,您可以通过在类型对象上调用IsValueType来查明泛型类型是类类型还是值类型。但请注意,测试对象实例是否为值类型没有意义。虽然C#会假装引用类型字段可以包含值类型实例,但这是一种幻觉。对于每个值类型,都有一个具有相同名称和字段的相应类类型。在包含对此类实例的引用的存储位置上调用GetType().IsValueType将报告为true,即使存储位置实际上包含对类对象的引用。这可以通过实现变异接口的结构很容易地证明(例如List<string>.Enumerator,我简称为LSE)。

存储在LSE类型变量中的LSE将表现为值类型。将要将列表的第三项返回的LSE复制到另一个类型LSE的变量将产生第二个独立的枚举器,它也将返回第三项。可以从任一枚举器读取项目而不影响另一个。相反,如果一个变量的类型为IEnumerable<string>,其中包含对LSE的引用,另一个将其复制到另一个类型为IEnumerable<string>的变量,则其中一个将具有对< i>相同的枚举器。从一个调查员中读取项目也会推进另一个调查员。换句话说,将LSE复制到引用类型的存储位置会产生一些行为类似于引用类型的东西,因为在封面下它实际上是一个。

请注意,在存储位置调用GetType不会显示它是否包含实数值类型,或者它是否包含与值类型关联的类的对象。在前一种情况下,系统将创建与值类型关联的类的新实例,并在其上调用GetType,因此在这两种情况下,GetType调用实际上将在类类型上处理实例