C#中使用和obj以及直接构造函数之间的区别

Ana*_*bhi 0 .net c# oop constructor object

假设我有一个名为"ABC"的类

Class ABC:IDisposable
{
    public string name {get;set;}
    public string Method1()
    {
    // Implements 
    }
    //end of class
}
Run Code Online (Sandbox Code Playgroud)

我从其他人那里听说你应该使用always inherit IDisposable来释放内存创建上面类的对象,如下所示:

using(ABC objABC = new ABC())
{
  objABC.Method1();
}
Run Code Online (Sandbox Code Playgroud)

但是还有其他方法可以调用和使用Eg的上面的类和方法

private string testmethods()
{
    ABC objABC = new ABC();
    string test =  objABC.Method1();
    // I want to know this above `objABC` 's memory is free after finish `testmethods()`?
    // we can also call using this like below
    string test2 = new ABC().Method1();
}
Run Code Online (Sandbox Code Playgroud)

我想知道哪种方法最好?

我也想知道的是,对象内存是在testmethods()通话结束后自动清除的吗?

Lee*_*Lee 6

假设ABC不保留任何非托管资源,则不需要实现IDisposable.只要没有对它们的实时引用,C#中的对象就有资格进行垃圾收集,当垃圾收集器运行时,它们使用的内存将自动释放.

只有IDisposable拥有需要释放的非托管资源或拥有其他实现的托管对象时,才需要实现类IDisposable.如果您的类拥有非托管资源,那么如果在收集之前未调用它们,它们还应实现终结器以释放它们Dispose.

因此,第二种方法是首选方法,并且objABCobjABC.Method1返回后有资格进行收集(实际上可以尽快收集,尽管这是一种内部GC机制).请注意,它不会在该点自动释放,但仅在GC下次运行时才会释放,假设没有更多的引用.


Jan*_*aus 5

一次性模式的存在是为了释放非托管资源.因此,除非您的C#程序调用某些本机API,或者使用自己实现Disposable模式的类,让您的类实现IDisposable并始终处理它using是完全没有意义的.