普通类型系统 - 结构

时间:2016-05-05 00:33:57

标签: c# .net structure cts

我在这里遇到了编程术语,这让我感到困惑,我无法收集我对如何从Common Type System页面实际正确地表达(写)这些MSDN理论句子的想法。

有人会帮我这个,我想明白这一点! 如果有人会如此友好地写一些代码并对此问题发表评论, 它会很棒,值得你称赞!

//这是文本(取自“结构”段落): https://msdn.microsoft.com/en-us/library/zcx1eb1e(v=vs.110).aspx#

“对于每种值类型,公共语言运行库提供相应的盒装类型,这是一个与值类型具有相同状态和行为的类。 将值类型的实例传递给接受System.Object类型的参数的方法时,将其装箱。 当控件从接受值类型作为by-reference参数的方法调用返回时,它被取消装箱(即,从类的实例转换回值类型的实例)。 有些语言要求在需要盒装类型时使用特殊语法;其他人在需要时自动使用盒装类型。 定义值类型时,您要定义盒装类型和未装箱类型。“

提前谢谢你,最好的问候!

2 个答案:

答案 0 :(得分:0)

object和值类型的存储方式不同。 object是指向堆中内存的指针,其中包含该对象的二进制表示形式。堆栈是分配用于存储指针和值类型的内存。因此,函数没有指向integerbool的指针。它传递了实际值的副本。

但是如果你有这样的方法:

string GetString(object o)
{
    return o.ToString();
}

该方法需要一个对象,即指向内存中某个位置的指针,即使您向其传递值类型也是如此。因此,为了做到这一点,框架必须创建一个存储在包含int的堆上的对象,以便它可以将该值的引用(指针)传递给该函数。那个拳击。

拳击是隐含的。您无需调用某些转换功能即可将int转换为object

当您获取该对象并将其强制转换为值类型时,会发生取消装箱。例如,

object x = 5;   //Boxes the value to create an object with a pointer
var y = (int)x; //Unboxes the value, creating an int on the stack.

当您取消装箱存储在堆中并由x引用的对象时,将检查其值并检索其值。拆箱是明确的。当您将任何内容从object转换为值类型时,您必须指定要将其转换为的类型。

答案 1 :(得分:0)

.NET是不可知的语言,它使程序员可以用不同语言(可以编译为IL)编写代码,并且该代码可以与用不同语言编写的其他代码进行交互。

此功能由CTS(通用类型系统)提供,CTS是一种标准,用于指定如何在内存中表示类型定义以及如何在 CLR (通用)中声明,使用和管理类型。语言运行时)。

示例

C#具有 int 数据类型,而VB.NET具有 Integer 数据类型。编译后, int和Integer的两个实例将使用来自CTS的相同结构Int32

enter image description here