当使用new操作符创建类的实例时,将在堆上分配内存。当你用new操作符创建一个结构体实例时,内存分配在哪里,在堆上还是在堆栈上?
当前回答
结构体被分配给堆栈。下面是一个有用的解释:
结构体
此外,在.NET中实例化的类分配内存 堆或。net的预留内存空间。而结构体的产量更高 由于在堆栈上的分配,实例化时的效率。 此外,应该注意在结构中传递参数 是通过值来实现的。
其他回答
包含结构的字段的内存可以根据情况分配到堆栈或堆上。如果结构类型变量是未被某个匿名委托或迭代器类捕获的局部变量或形参,则它将被分配到堆栈上。如果变量是某个类的一部分,那么它将在堆上的类中分配。
如果结构体是在堆上分配的,那么实际上不需要调用new操作符来分配内存。唯一的目的是根据构造函数中的内容设置字段值。如果未调用构造函数,则所有字段将获得默认值(0或null)。
同样,对于在堆栈上分配的结构,除了c#要求在使用所有局部变量之前将它们设置为某个值,因此您必须调用自定义构造函数或默认构造函数(不带参数的构造函数总是可用于结构)。
很多被认为是值类型的结构体都是在堆栈上分配的,而对象是在堆上分配的,而对象引用(指针)是在堆栈上分配的。
与所有值类型一样,结构体总是在声明它们的地方。
有关何时使用结构体的更多细节,请参阅此处的问题。 这个问题是关于结构体的更多信息。
编辑:我错误地回答他们总是在堆栈。这是不正确的。
简单地说,new是struct的用词不当,调用new只是调用构造函数。结构体的唯一存储位置是定义它的位置。
如果它是成员变量,它将直接存储在定义它的任何地方,如果它是局部变量或参数,它将存储在堆栈中。
与此形成对比的是类,类在结构完整存储的任何位置都有引用,而引用点则位于堆上的某个位置。(Member within, local/parameter on stack)
研究一下c++可能会有所帮助,在c++中,类/结构之间没有真正的区别。(在语言中有类似的名字,但它们只指事物的默认可访问性)当你调用new时,你会得到一个指向堆位置的指针,而如果你有一个非指针引用,它会直接存储在堆栈上或其他对象中,就像c#中的结构体一样。
类或结构声明就像一个蓝图,用于在运行时创建实例或对象。如果定义一个名为Person的类或结构,则Person是类型的名称。如果声明并初始化一个Person类型的变量p,则p是Person的对象或实例。可以创建同一Person类型的多个实例,并且每个实例的属性和字段可以具有不同的值。
类是引用类型。创建类的对象时,赋给该对象的变量仅保存对该内存的引用。当对象引用被赋值给一个新变量时,新变量引用原始对象。通过一个变量所做的更改会反映在另一个变量中,因为它们都引用相同的数据。
结构是一种值类型。创建结构时,分配给该结构的变量保存该结构的实际数据。当该结构体被赋值给一个新变量时,它将被复制。因此,新变量和原始变量包含相同数据的两个独立副本。对一个副本所做的更改不会影响另一个副本。
一般来说,类被用来建模更复杂的行为,或者在创建类对象后要修改的数据。结构最适合于小型数据结构,这些数据主要包含在结构创建后不打算修改的数据。
更多的……
推荐文章
- 实体框架核心:在上一个操作完成之前,在此上下文中开始的第二个操作
- 如何为构造函数定制Visual Studio的私有字段生成快捷方式?
- 为什么Visual Studio 2015/2017/2019测试运行器没有发现我的xUnit v2测试
- 如何使用JSON确保字符串是有效的JSON。网
- AppSettings从.config文件中获取值
- 通过HttpClient向REST API发布一个空体
- 如何检查IEnumerable是否为空或空?
- 自动化invokerrequired代码模式
- 没有ListBox。SelectionMode="None",是否有其他方法禁用列表框中的选择?
- 在c#代码中设置WPF文本框的背景颜色
- 在c#中,什么是单子?
- c#和Java中的泛型有什么不同?和模板在c++ ?
- c#线程安全快速(est)计数器
- 如何将此foreach代码转换为Parallel.ForEach?
- 如何在iis7应用程序池中设置。net Framework 4.5版本