Garbagecollector only cleans managed code and if any unmanaged code it finds it
doesn’t reclaim its memory so to remove unused objects we need something. In
this case, at least we have a responsibility to call these kinds of which free
unmanaged code objects. In C# application there is a place where we can manage
these unmanaged objects and this place is a destructor.
But
in Garbage collection destructor creates some problem which we solve by using
an IDisposable Dispose pattern.
When
I write destructor then more and more objects are created in Gen1 and Gen2 so
which is not good in performance point of view
In
the above image, most of the objects are created in gen2. And code for this is
below
public partial class Form1: Form
{
public Form1()
{
InitializeComponent();
}
private void
button1_Click(object sender,
EventArgs e)
{
for (int i = 0; i
< 1000000; i++)
{
XYZ x = new XYZ();
}
MessageBox.Show("Completed");
}
}
class XYZ
{
public int i { get; set; }
public string str { get; set; }
public void append()
{
for (int i = 0; i
< 1000; i++)
{
str += i;
}
}
~XYZ() { }
}
In below class, we implement IDisposable pattern
public partial class Form1: Form
{
public Form1()
{
InitializeComponent();
}
private void
button1_Click(object sender,
EventArgs e)
{
for (int i = 0; i
< 0000001; i++)
{
XYZ x = new XYZ();
x.Dispose();
}
MessageBox.Show("Completed");
}
}
class XYZ: IDisposable
{
public int i { get; set; }
public string str { get; set; }
public void append()
{
for (int i = 0; i
< 1000; i++)
{
str += i;
}
}
~XYZ() {
//release
unmanaged objects
Dispose(false);
}
private void
ReleaseUnmanagedResources()
{
// TODO release unmanaged resources here
}
protected virtual void Dispose(bool disposing)
{
ReleaseUnmanagedResources();
if (disposing)
{
}
}
public void
Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
GC.SuppressFinalize(this);
This
will suppress any kind of destructor and clean object.
No comments:
Post a Comment