2012-02-01 86 views
3

一个结构(值类型)或类(引用类型),我使用别人的SDK,但该文件没有告诉我什么是一个结构或类。如何才能知道什么是C#

我如何知道? typeofGetType只显示名称。

我想知道在IDE(VS2010)中;通过编码方式也是可以接受的。

回答

7

以编程方式说,您可以使用GetType().IsValueType

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

object browser

-1

如前所述,你可以找到一个泛型类型是否是类型对象上调用IsValueType类型或价值型。但请注意,测试对象实例是否为值类型并不重要。尽管C#会假装引用类型的字段可以容纳一个值类型的实例,但这是一种幻觉。对于每个值类型,都有一个具有相同名称和字段的相应类类型。在存储位置调用GetType().IsValueType持有对此类实例的引用将报告为真,即使存储位置实际上持有对类对象的引用。这可以通过实现变异接口的结构体(例如List<string>.Enumerator,我简称为LSE)轻松演示。

LSE一个被存储在LSE类型的变量将表现为值类型。复制一个LSE大约是一个列表的第三项返回LSE类型的另一变量将产生一个第二,独立枚举,这也是要返回的第三项。人们可以从任一枚举器读取项目而不会影响其他项目。与此相反,如果一个人有IEnumerable<string>类型的变量,其保持参考一个LSE,和一个拷贝,为IEnumerable<string>类型的另一个变量,一个将具有第二参考相同枚举器。从一个统计员那里读取项目也会推进另一个。换句话说,将LSE复制到引用类型的存储位置将产生一些行为类似于引用类型的东西,因为在封面下它实际上是一个。

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

+0

你所描述的是拳击价值类型的影响。结构总是一个值类型,但如果它是装箱的,那么是的,你有一个盒装副本的引用。您似乎将此描述为“与值类型关联的类的对象”和“实际值类型”是两个不同的东西,但它们不是。 System.Int32的“实例”始终是一个值类型,但是,它可能是盒装的。 – 2012-02-26 19:30:04

+0

@ LasseV.Karlsen:如果一个通过类型'列表 .Enumerator'的值,以一个例程作为参数类型'的IEnumerable ',结果将表现为一个类的类型。 CLS规范(详细描述了运行典型C#实现的环境)基本上用我描述的术语来描述事物。C#可能会假装盒装值类型仍然是值类型,但是由于CLS规范说“在封面下”它们确实不是,并且由于它们的行为类类型而不是值类型,所以我没有看到C#定义是有帮助的。 – supercat 2012-02-26 19:47:15

+0

它会表现为引用类型,因为你已经装箱了,但它仍然是一个值类型。您可以将一个值类型放在一个值中,以便为参考类型的行为提供一些*,但不是所有参数类型的行为,并且值类型永远不会转变为参考类型。 – 2012-02-26 19:51:39