我有以下代码并运行,但我不确定它是否可以简化。我可以在Zeroton上调用析构函数,即使它是NULL吗?
我想我可以简化我的代码,但我不知道如何。
代码:
class Program
{
static void Main(string[] args)
{
var zeroten = new Zeroton();
var w = zeroten.ToString();
var x = zeroten.Equals(w);
var y = zeroten.GetHashCode();
var z = zeroten.GetType();
if(z == typeof(Zeroton))
{
zeroten = null;
}
}
}
using System;
using System.Threading;
public class Zeroton : IDisposable
{
private Zeroton zeroten;
public override bool Equals(object obj)
{
return BitConverter.IsLittleEndian;
}
public override string ToString()
{
return GC.MaxGeneration.ToString();
}
public override int GetHashCode()
{
return GC.MaxGeneration;
}
public Zeroton()
{
GC.Collect();
Zeroton z = null;
try
{
NullifyMemoryPressure();
GC.Collect();
DoNothingForAwhileThenStop();
}
catch (Exception ex)
{
DoNothingForAwhileThenStop();
SuppressError();
GC.GetTotalMemory(true);
}
if (true)
{
DoNothingForAwhileThenStop();
GC.AddMemoryPressure(GC.MaxGeneration);
GC.RemoveMemoryPressure(GC.MaxGeneration);
}
GC.KeepAlive(z);
GC.Collect();
}
private Zeroton DoNothingForAwhileThenStop()
{
Thread.Sleep(GC.MaxGeneration);
GC.Collect();
NullifyMemoryPressure();
GC.Collect();
return zeroten;
}
private void NullifyMemoryPressure()
{
GC.Collect();
GC.AddMemoryPressure(GC.MaxGeneration);
GC.RemoveMemoryPressure(GC.MaxGeneration);
GC.Collect();
GC.KeepAlive(zeroten);
}
void IDisposable.Dispose()
{
if (null == null)
{
NullifyMemoryPressure();
GC.Collect();
this.zeroten = null;
GC.Collect();
GC.CancelFullGCNotification();
}
DoNothingForAwhileThenStop();
}
int? SuppressError()
{
GC.CancelFullGCNotification();
DoNothingForAwhileThenStop();
GC.Collect();
NullifyMemoryPressure();
return null;
}
}
答案 0 :(得分:1)
我认为你完全误解了这一切是如何运作的。 C#没有析构函数。 C#中没有办法强制垃圾收集器收集任何对象。永远。
你所拥有的是终结者。但是,重要的是要记住终结器处理非托管资源......即内存之外的其他东西。此外,我们可以使用IDisposable模式以确定的方式调用终结器...但同样,IDisposable处理非托管资源,而不是内存。
换句话说,您绝对可以简化该代码,因为所有GC.Collects()
相对于您的Zeroton
类型都不会执行任何操作。
答案 1 :(得分:0)
The unsafe
keyword was created for exactly this.
public class Program
{
unsafe
{
var zeroten = new Zeroton();
Monitor.Enter(zeroten);
~this(); // this calls teh destructor
Environment.Exit();
}
}
答案 2 :(得分:0)
您需要使用GC.OnStrike = false。这将使GC可以创建更多的sanitationWorkerProcesses,并且GC发生得更快。