在C#中使用大括号释放内存

在C#中使用大括号释放内存,c#,optimization,C#,Optimization,我想知道在方法调用中使用花括号定义作用域是否会“强制”或向C#垃圾收集器提供信息以释放该块中分配的内存,因此,让我们以下面的代码为例: void MyMethod() { //here some important code, like reading some information from disk, api, whatever. //Open brackets to define scope... { var myClassObject = new MyClass();

我想知道在方法调用中使用花括号定义作用域是否会“强制”或向C#垃圾收集器提供信息以释放该块中分配的内存,因此,让我们以下面的代码为例:

void MyMethod() {
//here some important code, like reading some information from disk, api, whatever.
//Open brackets to define scope...
  {
   var myClassObject = new MyClass();
   myClassObject.DoSomething();
   var mySecondClassObject = new MySecondClass();
   mySecondClassObject.DoSomething();
  }
   //I expect that at this moment, GC would release myClassObject and MySecondClassObject from the Heap... 
   //is that correct?

  //here do something else
  /...
}

简而言之:不可以。您无法强制垃圾收集器处理此分配的垃圾!上课!现在就处理


在长:你可能是。您只需将变量设置为
Null
并调用
GC.Collect()
。这将调用普通的GC集合,并且可以在其集合中包含以前未引用的类,但是没有任何证据表明会发生这种情况。但这将为整个应用程序调用垃圾收集器,而不仅仅是这个线程。这在设计上是不可能的。

否。GC可以收集变量。您将垃圾收集的资格与实际收集垃圾混淆了。您的变量将尽快符合条件,但集合将在中启动。GC在进行清理时不确定。通常,当内存压力很大时,它会这样做,例如,当您的进程内存不足时。但再说一次:你为什么在乎?你有什么特别的问题吗?也许这有帮助:这是C++思维,根本不适用于C。NET使用积极的收集器,当使用该对象的方法仍在执行时,可以销毁对象。重要的是,在Main()中分配的内容不一定在进程的生命周期内有效。即时编译器的一个主要但高度不可见的工作就是确保它的安全性。它构建一个表,报告对象正在使用的确切机器代码地址。无论是支架还是范围都没有发挥作用。@布鲁诺如果你想让你的应用程序消耗最少的资源,那么C语言不是你的应用程序的最佳语言,你可以选择C、C++、Rust等,但是如果这只是一个宠物的困扰,而不是对你的应用程序至关重要的话,然后你可以接受这样一个事实,即C#GC最终将回收内存(当然,除非你正在泄漏句柄)。请不要建议将对象引用设置为null。