在if语句条件中使用new运算符是个坏主意?

Kep*_*lah 2 c#

if (!someList.Contains(new listItem(arg1, args2)))
{
    // Do some stuff
}
Run Code Online (Sandbox Code Playgroud)

对于上面的代码段,someList是结构列表并且listItem是结构.

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

Ser*_*rvy 6

你必须非常努力地在C#中创建内存泄漏.这是可能的,但是偶然发生的情况并不多(除了与没有这种简单的内存管理的其他语言交互时).我不会在这里讨论边缘情况.

以下是该对象的内存:

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

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

值得一提的是,即使这是一个类,而不是一个结构,它也不会导致任何内存泄漏.该对象最终将在堆上,但垃圾收集器将在不再需要它之后的某个时刻进行清理.你没有在这里做任何事情会导致一旦不需要就保持对象的引用(我知道Contains不会做任何会阻止它被收集的恶作剧;如果它是一些未知的功能它是可能但不太可能他们做某事意味着什么).