Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中结构中的引用类型#_C# - Fatal编程技术网

C# C中结构中的引用类型#

C# C中结构中的引用类型#,c#,C#,我研究了C#中的类型值,了解到它们不会像普通引用类型那样在堆上分配。如何分配引用类型为的结构 e、 g Employee是一个类。初始化时,e会被分配到堆吗?它是否违背了拥有结构的意义?类型(值/引用)的“种类”与实例的分配方式几乎没有关系。这都是关于生命周期的,分配的方式比“堆”和“堆栈”更多。阅读 但就您的问题而言,这是有意义的:结构的成员类型不会影响结构实例的分配方式,因为它们不会影响对象的生存期。顺便说一句,班级也是如此 成员e将是值类型对象的一部分,并在可能的位置进行分配。此成员是一个

我研究了C#中的类型值,了解到它们不会像普通引用类型那样在堆上分配。如何分配引用类型为的结构

e、 g

Employee
是一个类。初始化时,
e
会被分配到堆吗?它是否违背了拥有结构的意义?

类型(值/引用)的“种类”与实例的分配方式几乎没有关系。这都是关于生命周期的,分配的方式比“堆”和“堆栈”更多。阅读

但就您的问题而言,这是有意义的:结构的成员类型不会影响结构实例的分配方式,因为它们不会影响对象的生存期。顺便说一句,班级也是如此

成员
e
将是值类型对象的一部分,并在可能的位置进行分配。此成员是一个引用,因此任何实际引用的
员工
对象
e
都将分配到其他地方1。虽然这听起来像一条规则,但这并不是一条特殊的规则;局部变量、类成员和数组项的行为方式相同。它并不违背值类型的观点,而是保持了值类型和引用类型的优点。值类型实例仍然是单独的值,而不是别名,并且它们仍然具有更简单、更短的生命周期,从而可以用更少的精力进行更好的分配选择。引用类型实例仍然是共享的,并且(可能)存在很长时间


1至少在概念上和当前实施中;在非常简单的情况下,优化(escape analysis+allocation sinking)可以合并这些分配,但据我所知,没有一个CLR会这样做。

引用变量“e”将分配到分配结构的任何位置(例如,未绑定结构类型的局部变量可能会出现在堆栈上)。“e”指向的雇员实例将在堆上分配。这在.NET实现之间可能有所不同,但最有可能适用于所有当前实现。

结构内存是“在线”分配的。类内存在堆上分配,引用(指针)分配为“串联”

如果在程序中看到一个名为C的类变量,那么该变量的存储将相当于一个指针(比如4字节),而该类的实际存储将在堆上

但如果在程序中看到名为S的结构变量,则该变量的存储空间仅为声明点处变量的大小。没有为其分配堆存储

如果C包含一个S,那么S将位于C的堆存储中

如果S包含一个C,那么对C的引用将位于S的存储器中,而C的存储器位于堆上。这是您关于
simple
e
的问题的答案

因此,结构存储实际上可以在静态内存中、堆栈上或堆上(类内部)。类内存总是在堆上

        struct simple{
            public Employee e;
            public bool topEmployee;
            public void printSomething()
            {
                Console.WriteLine("Progress " + e.GetProgressReport());
                Console.WriteLine("TopEmployee " + topEmployee);
            }
        };