c# - 为什么可以在没有 new 关键字的情况下实例化结构?

标签 c# .net struct instantiation

为什么我们不像在使用类时那样强制实例化一个结构体?

最佳答案

Why are we not forced to instantiate a struct with "new", like when using a class?

当您“新建”一个引用类型时,会发生三件事。首先,内存管理器从长期 存储中分配空间。其次,将该空间的引用传递给初始化实例的构造函数。第三,该引用被传递回调用者。

当您“新建”一个值类型时,会发生三件事。首先,内存管理器从短期 存储分配空间。其次,向构造函数传递对短期存储位置的引用。构造函数运行后,短期存储位置中的值将被复制到该值的存储位置,无论它恰好在哪里。请记住,值类型的变量存储实际值

(请注意,如果编译器可以确定这样做永远不会将部分构造的结构暴露给用户代码,则允许编译器将这三个步骤优化为一个步骤。也就是说,编译器可以生成仅传递引用的代码到构造函数的最终存储位置,从而节省一次分配和一份副本。)

现在我们可以解决您的问题,您实际上已经向后提出了这个问题。最好问:

Why are we forced to allocate a class with "new", instead of simply being able to initialize the fields as with a struct?

由于列表中的这三件事,您必须分配一个带有"new"的类。您需要从长期存储中分配新内存,并且需要将对该存储的引用传递给构造函数。 "new"是知道如何做到这一点的运营商。

您不必在结构上调用“new”,因为不需要分配“最终”存储; 最终存储已经存在。新值将去往某处,而您已经通过其他方式获得了该存储空间。 值类型不需要重新分配;他们所需要的只是初始化。您需要做的就是确保存储被正确初始化,并且您通常可以在不调用构造函数的情况下做到这一点。 这样做当然意味着您冒着使用值类型变量的风险,该变量可以被用户代码观察到处于部分初始化状态。

总结:调用构造函数对于值类型是可选的,因为在初始化值类型的实例时不需要分配新内存,因为跳过构造函数调用意味着你得到跳过短期分配和复制。您为提高性能付出的代价是用户代码可以看到部分初始化的结构。

关于c# - 为什么可以在没有 new 关键字的情况下实例化结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7767669/

相关文章:

.net - 我有 4 个整数。我如何找到最大/最小的?

c# - DateTime 天结束 24 :00 (midnight)

xcode - 在调试期间检查 Swift 中的结构不起作用

c# - EF 5 更新 N 级深度对象图?

c# - 将列表从 View 传递到模型中的 Controller

c# - 参数化 Action

c# - 枚举字符串属性时出现 TargetParameterCountException

c# - CefSharp - 没有复制快捷菜单项

c - 指向结构内部变量的指针

c - 在结构函数中分配动态数组