gpt4 book ai didi

c# - 在 if 语句条件中使用新运算符是个坏主意吗?

转载 作者:行者123 更新时间:2023-11-30 19:06:21 25 4
gpt4 key购买 nike

if (!someList.Contains(new listItem(arg1, args2)))
{
// Do some stuff
}

对于上面的代码段,someList 是一个结构列表,listItem 是结构。

在此上下文中使用 new 运算符会导致内存泄漏吗?或者这是一般不良做法的一个例子?我在 SO 和 Google 上四处搜索,但找不到专门解决这个问题的问题。

最佳答案

您必须非常努力地工作才能在 C# 中创建内存泄漏。这是可能,但意外发生的情况并不多(除了与其他没有这种直接内存管理的语言互操作时)。不过,我不会在这里讨论边缘情况。

这是该对象的内存:

  • 一个局部变量将在任何方法中创建,其中包含您显示的代码。由于您没有明确地将新结构设置为局部变量,因此它将具有一些无法在代码中引用的名称。
  • 它将通过堆栈传递给您调用的方法。 (它将按值传递,因此此时将有两个具有相同结构的变量)。
  • Contains 返回时,其调用堆栈上的参数将被“释放”,因此我们现在回到只有一个变量的状态。
  • 当您当前使用的方法完成时(或者可能更早一点,如果编译器想要优化它,知道它不再被使用)结构的堆栈空间将被“释放”

即使使用了 new 关键字,也不会在堆上创建结构。它仍然是在堆栈上创建的。在 C# 中,new 用于显式调用任何构造函数(禁止反射)并且不指示堆上的分配(它在 C++ 中的方式)。

还值得一提的是,即使这是一个类而不是结构,也不会导致任何内存泄漏。该对象最终会在堆上,但垃圾收集器会在不再需要它后的某个时候负责清理它。你在这里没有做任何会导致在不需要时保留对该对象的引用的事情(而且我知道 Contains 不会做任何会阻止它被收集的恶作剧; 如果它是一些未知的功能,他们可能会但不太可能做一些卑鄙的事情)。

关于c# - 在 if 语句条件中使用新运算符是个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12220414/

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