我可以从私有构造函数中调用析构函数并使用垃圾收集吗?

时间:2016-08-17 21:21:23

标签: c#

我有以下代码并运行,但我不确定它是否可以简化。我可以在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;
    }
}

3 个答案:

答案 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发生得更快。