Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中使用obj和直接构造函数的区别#_C#_.net_Oop_Object_Constructor - Fatal编程技术网

C# C语言中使用obj和直接构造函数的区别#

C# C语言中使用obj和直接构造函数的区别#,c#,.net,oop,object,constructor,C#,.net,Oop,Object,Constructor,假设我有一个名为“ABC”的类 Class ABC:IDisposable { public string name {get;set;} public string Method1() { // Implements } //end of class } 我从其他人那里听说,您应该使用always inheritIDisposable来释放上述类的创建对象的内存,如下所示: using(ABC objABC = new ABC()) {

假设我有一个名为“ABC”的类

Class ABC:IDisposable
{
    public string name {get;set;}
    public string Method1()
    {
    // Implements 
    }
    //end of class
}
我从其他人那里听说,您应该使用always inherit
IDisposable
来释放上述类的创建对象的内存,如下所示:

using(ABC objABC = new ABC())
{
  objABC.Method1();
}
但是还有其他方法可以调用和使用上面的类和方法,例如

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();
}
我想知道实现这一目标的最佳方式是什么


我还想知道的是,对象内存是否在
testmethods()
调用结束后自动清除?

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

如果类拥有需要释放的非托管资源,或者拥有实现
IDisposable
的其他托管对象,则它们只需要实现
IDisposable
。如果您的类持有非托管资源,那么如果在收集这些资源之前未调用
Dispose
,它们还应该实现释放这些资源的方法


因此,第二种方法是首选方法,
objABC
objABC.Method1
返回后有资格收集(尽管这是一种内部GC机制,但实际上可能会更早收集)。请注意,它不会在该点自动释放,但只有在GC下次运行时才会自动释放,前提是不再有对它的引用。

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

IDisposable接口设计用于支持一次性模式,该模式用于显式释放除内存资源之外的其他资源:由于垃圾收集器(GC)只能处理内存,因此其他资源(如打开文件、,数据库连接,各种非托管 应明确关闭资源等

使用IDisposable的典型方案是

  // MyResourceWrapper is IDisposable
  using (MyResourceWrapper wrapper = new MyResourceWrapper()) { // <- acquire resource
    ... // <- work with resource
  } // <- free resource   
//MyResourceWrapper是IDisposable

使用(MyResourceWrapper=new MyResourceWrapper()){/首先问问你自己-你会在问题的第二个代码部分写一个try finally块吗?如果是,那么你会在finally块中写什么?如果你的ABC类使用非托管资源,并且它实现了IDisposable接口,那么你会在finally块中调用Dispose方法

using(ABC objABC = new ABC())
{
  objABC.Method1();
}
相当于:-

ABC objABC = new ABC()
try
{
   objABC.Method1();
}
finally
{
   objABC..Dispose()
}
所以现在,若在ABC类中并没有任何非托管的东西要处理,那个么为什么要在这个类上实现IDisposable接口呢

具有非托管资源的类的一个示例是SqlConnection,它实现IDisposable,并在其Dispose方法中处置所有这些非托管资源。这就是为什么您会看到人们使用以下代码:-

using (SqlConnection connection = new SqlConnection(connectionString))
{
...........
}

使用
block是调用
Dispose
方法的一种简便方法(并不总是意味着释放资源),但您不必总是使用它。它可以让您的生活更轻松“我的上级说您应该使用always inherit IDisposable来释放内存”-你的前辈是自封的前辈吗?那句话只会让人尖叫。老实说,在编辑了几次之后,我注意到代码有很多不一致之处……请在发布前仔细检查!它还用于释放托管资源(=包装的非托管资源).所以,如果我继承了
IDisposable
我就不需要使用
来使用
来阻止,对吗?@HenkHolterman是的,但这就是Jandorenhaus所说的。当一个本机类拥有非托管资源时,它应该已经实现IDisposable了。而且你还可以使用它来取消事件处理程序的挂钩,以避免资源泄漏。@Anantdabi
使用
只是一种安慰enience代码用于自动
Dispose
调用。因此,要么你的类实现了
IDisposable
,那么你应该使用
使用
来处理它,要么它没有实现
IDisposable
,那么你就不能使用
使用
来处理它。嗯,这是非常有用的信息。我陷入了垃圾和其他东西中,我不知道o考虑未老化的代码。@anantdabi-Upvote,如果您觉得这有用的话。:-)
using (SqlConnection connection = new SqlConnection(connectionString))
{
...........
}