gpt4 book ai didi

c# - c#中的声明是分配内存还是分配内存的新运算符?

转载 作者:行者123 更新时间:2023-11-30 18:51:02 26 4
gpt4 key购买 nike

c# 中的声明是为要创建的变量分配内存,还是分配内存并启用调用构造函数来初始化内存中分配的变量的 new 运算符?

据我了解,如果没有 new 运算符,则无法调用任何类型的构造函数。我对么?

最佳答案

Does declaration in c# allocate memory for the variable to be created or is it the new operator that allocates memory and enables to invoke the instructor to initialize the allocated variable in memory?

首先,让我们确保您在问您认为自己在问的问题。对于值类型,变量存储位置和值存储位置是同一个存储。对于引用类型,与变量 关联的存储位置包含对与对象 关联的存储位置的引用。那些是完全不同的。

其次,让我们澄清一下“变量”的“声明”是什么意思。静态字段、实例字段、局部变量和形式参数都有声明。此外,如果局部变量和形式参数是 lambda 的封闭外部局部变量,则它们的分配语义是不同的,并且当局部变量位于异步方法或迭代器 block 中时,语义也不同。

所以让我们假设您有一个引用类型的局部变量,并且没有什么特别之处:

void M() { 
Animal x = new Giraffe(); ...

当方法 M() 被激活时,局部变量 x 的存储位置是从短期存储(通常是堆栈或寄存器)中分配的。

当评估“new Giraffe()”时,运行时会在长期存储(GC 堆)上为 Giraffe 分配内存,然后将对该对象的引用传递给构造函数。当构造函数返回时,然后将引用分配给本地。

所以有两个存储位置。有 x 的短期位置,它只在方法激活时存在,还有被引用的东西的长期存储,它一直存在直到垃圾收集器清理它。

如果这不能回答您的问题,请澄清您的问题。

Can you call a constructor without the new operator?

我假设“构造函数”是指实例构造函数,而不是静态构造函数。

不是以任何“正常”方式,不。

关于c# - c#中的声明是分配内存还是分配内存的新运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15824971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com