当使用new操作符创建类的实例时,将在堆上分配内存。当你用new操作符创建一个结构体实例时,内存分配在哪里,在堆上还是在堆栈上?
当前回答
包含结构的字段的内存可以根据情况分配到堆栈或堆上。如果结构类型变量是未被某个匿名委托或迭代器类捕获的局部变量或形参,则它将被分配到堆栈上。如果变量是某个类的一部分,那么它将在堆上的类中分配。
如果结构体是在堆上分配的,那么实际上不需要调用new操作符来分配内存。唯一的目的是根据构造函数中的内容设置字段值。如果未调用构造函数,则所有字段将获得默认值(0或null)。
同样,对于在堆栈上分配的结构,除了c#要求在使用所有局部变量之前将它们设置为某个值,因此您必须调用自定义构造函数或默认构造函数(不带参数的构造函数总是可用于结构)。
其他回答
与所有值类型一样,结构体总是在声明它们的地方。
有关何时使用结构体的更多细节,请参阅此处的问题。 这个问题是关于结构体的更多信息。
编辑:我错误地回答他们总是在堆栈。这是不正确的。
很多被认为是值类型的结构体都是在堆栈上分配的,而对象是在堆上分配的,而对象引用(指针)是在堆栈上分配的。
结构体被分配给堆栈。下面是一个有用的解释:
结构体
此外,在.NET中实例化的类分配内存 堆或。net的预留内存空间。而结构体的产量更高 由于在堆栈上的分配,实例化时的效率。 此外,应该注意在结构中传递参数 是通过值来实现的。
简单地说,new是struct的用词不当,调用new只是调用构造函数。结构体的唯一存储位置是定义它的位置。
如果它是成员变量,它将直接存储在定义它的任何地方,如果它是局部变量或参数,它将存储在堆栈中。
与此形成对比的是类,类在结构完整存储的任何位置都有引用,而引用点则位于堆上的某个位置。(Member within, local/parameter on stack)
研究一下c++可能会有所帮助,在c++中,类/结构之间没有真正的区别。(在语言中有类似的名字,但它们只指事物的默认可访问性)当你调用new时,你会得到一个指向堆位置的指针,而如果你有一个非指针引用,它会直接存储在堆栈上或其他对象中,就像c#中的结构体一样。
我可能遗漏了一些东西但是我们为什么要关心分配呢?
值类型是通过Value;)传递的,因此不能在不同于定义它们的范围内进行突变。为了能够改变值,您必须添加[ref]关键字。
引用类型是通过引用传递的,可以进行突变。
当然有不可变的引用类型字符串是最流行的。
阵列布局/初始化: 值类型->零内存[name,zip][name,zip] 引用类型-> 0内存-> null [ref][ref]
推荐文章
- 实体框架核心:在上一个操作完成之前,在此上下文中开始的第二个操作
- 如何为构造函数定制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版本