当使用new操作符创建类的实例时,将在堆上分配内存。当你用new操作符创建一个结构体实例时,内存分配在哪里,在堆上还是在堆栈上?
当前回答
结构体被分配给堆栈。下面是一个有用的解释:
结构体
此外,在.NET中实例化的类分配内存 堆或。net的预留内存空间。而结构体的产量更高 由于在堆栈上的分配,实例化时的效率。 此外,应该注意在结构中传递参数 是通过值来实现的。
其他回答
我可能遗漏了一些东西但是我们为什么要关心分配呢?
值类型是通过Value;)传递的,因此不能在不同于定义它们的范围内进行突变。为了能够改变值,您必须添加[ref]关键字。
引用类型是通过引用传递的,可以进行突变。
当然有不可变的引用类型字符串是最流行的。
阵列布局/初始化: 值类型->零内存[name,zip][name,zip] 引用类型-> 0内存-> null [ref][ref]
类或结构声明就像一个蓝图,用于在运行时创建实例或对象。如果定义一个名为Person的类或结构,则Person是类型的名称。如果声明并初始化一个Person类型的变量p,则p是Person的对象或实例。可以创建同一Person类型的多个实例,并且每个实例的属性和字段可以具有不同的值。
类是引用类型。创建类的对象时,赋给该对象的变量仅保存对该内存的引用。当对象引用被赋值给一个新变量时,新变量引用原始对象。通过一个变量所做的更改会反映在另一个变量中,因为它们都引用相同的数据。
结构是一种值类型。创建结构时,分配给该结构的变量保存该结构的实际数据。当该结构体被赋值给一个新变量时,它将被复制。因此,新变量和原始变量包含相同数据的两个独立副本。对一个副本所做的更改不会影响另一个副本。
一般来说,类被用来建模更复杂的行为,或者在创建类对象后要修改的数据。结构最适合于小型数据结构,这些数据主要包含在结构创建后不打算修改的数据。
更多的……
简单地说,new是struct的用词不当,调用new只是调用构造函数。结构体的唯一存储位置是定义它的位置。
如果它是成员变量,它将直接存储在定义它的任何地方,如果它是局部变量或参数,它将存储在堆栈中。
与此形成对比的是类,类在结构完整存储的任何位置都有引用,而引用点则位于堆上的某个位置。(Member within, local/parameter on stack)
研究一下c++可能会有所帮助,在c++中,类/结构之间没有真正的区别。(在语言中有类似的名字,但它们只指事物的默认可访问性)当你调用new时,你会得到一个指向堆位置的指针,而如果你有一个非指针引用,它会直接存储在堆栈上或其他对象中,就像c#中的结构体一样。
结构体被分配给堆栈。下面是一个有用的解释:
结构体
此外,在.NET中实例化的类分配内存 堆或。net的预留内存空间。而结构体的产量更高 由于在堆栈上的分配,实例化时的效率。 此外,应该注意在结构中传递参数 是通过值来实现的。
很多被认为是值类型的结构体都是在堆栈上分配的,而对象是在堆上分配的,而对象引用(指针)是在堆栈上分配的。
推荐文章
- 实体框架核心:在上一个操作完成之前,在此上下文中开始的第二个操作
- 如何为构造函数定制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版本