gpt4 book ai didi

c# - 为什么结构不能有析构函数?

转载 作者:IT王子 更新时间:2023-10-29 04:25:28 25 4
gpt4 key购买 nike

您认为这样的问题在面试中最好的答案是什么?

我想在这里找不到此副本,如果有副本,请链接它。

最佳答案

另一种看待这种情况的方法-而不是仅仅引用说明结构不能/没有析构函数的规范-考虑如果规范被更改以使它们发生了,会发生什么?或者,让我们问一个问题:可以我们猜想语言设计者为什么决定首先不允许结构具有“析构函数”?

(这里不要挂断词“析构函数”;我们基本上是在讨论结构上的魔术方法,当变量超出范围时会自动调用该方法。换句话说,一种类似于C++析构函数的语言功能。 )

首先要意识到的是,我们不关心释放内存。无论对象是在堆栈上还是在堆上(例如,类中的结构),迟早都会以一种或另一种方式来处理内存。从堆栈中弹出或被收集。首先拥有像析构函数之类的东西的真正原因是为了管理外部资源-文件句柄,窗口句柄之类的东西,或者其他需要特殊处理以清除CLR本身不知道的东西。

现在假设您允许一个结构具有一个可以执行此清除操作的析构函数。美好的。直到您意识到将结构作为参数传递时,它们都按值传递:将它们复制。现在,您有两个具有相同内部字段的结构,它们都将尝试清理同一对象。一个将首先发生,因此之后使用另一个的代码将开始神秘地失败...然后其自身的清理将失败(希望如此!-最坏的情况是它可能成功清理了一些其他随机资源-这可以例如,在重复使用句柄值的情况下发生。)

可以想象,可以对作为参数的结构进行特殊处理,以使它们的“析构函数”不运行(但是要小心-现在,您需要记住,在调用函数时,始终是外部拥有“实际”资源的函数) -所以现在有些结构与其他结构有些微不同...)-但是,您仍然会遇到常规结构变量的问题,可以将其中一个分配给另一个,以进行复制。

您可能可以通过在分配操作中添加一种特殊的机制来解决此问题,该机制以某种方式允许新结构与其新副本协商基础资源的所有权-也许它们共享该资源或将所有权从旧所有权直接转移到新资源-但现在您从本质上说,您已经进入C++ Realm ,在这里您需要复制构造函数,赋值运算符,并添加了许多微妙之处,以等待不了解新手的程序员。并且请记住,C#的重点是尽可能避免这种C++样式的复杂性。

而且,正如让其他答案之一指出的那样,为了使事情更加困惑,结构不仅仅作为局部对象存在。对于本地人来说,范围很好并且定义明确;但是结构也可以是类对象的成员。在这种情况下,何时应该调用“析构函数”?当然,您可以在容器类完成后执行此操作;但是现在您有了一种机制,该机制的行为取决于结构体的位置:如果结构体是本地结构,则它会在作用域结束时立即触发;如果该结构在一个类中,则它会被延迟触发...因此,如果您真的关心确保某个结构中的某些资源在特定时间被清除,并且您的结构最终可以作为a的成员而结束在类中,无论如何,您可能都需要显式的名称,例如IDisposable/using(),以确保您了解基础知识。

因此,虽然我不能声称要为语言设计师说话,但我可以做出一个很好的猜测,他们决定不包括这种功能的一个原因是因为它将是一 jar 蠕虫,并且他们希望保持C#相当简单。 。

关于c# - 为什么结构不能有析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8276036/

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