C# C语言中使用obj和直接构造函数的区别#
假设我有一个名为“ABC”的类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()) {
Class ABC:IDisposable
{
public string name {get;set;}
public string Method1()
{
// Implements
}
//end of class
}
我从其他人那里听说,您应该使用always inheritIDisposable
来释放上述类的创建对象的内存,如下所示:
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))
{
...........
}