1

例如,我有一个类Abc,并且为它创建了一个默认构造函数。

这两种语法有什么区别?

Abc obj = new Abc(); 

new Abc();
4

3 回答 3

13

唯一的区别是第二个不包含对创建对象的引用,因此它将立即有资格进行垃圾收集。

只有当“obj”超出范围被 GC 认为不再可达时,第一个才有资格进行 GC。


编辑

就OP而言,很难证明两者之间确实有任何区别。尝试运行这个程序,你会发现 1 和 2 都没有被 GC。

class Program
{
    public class Abc
    {
        byte[] _bytes;
        bool _notify;

        public Abc(bool notify = false, int size = 10000000)
        {
            _notify = notify;
            _bytes = new byte[size];
            if (notify) Console.WriteLine("Constructor called");
        }

        ~Abc()
        {
            if (_notify) Console.WriteLine("***** Destructor called *****");
            else Console.Write("!");
            System.Diagnostics.Debug.WriteLine("Destructor called");
        }
    }

    static void Main(string[] args)
    {
        // type 1, hold reference
        Abc abc = new Abc(true, 100000000);

        // type 2, throw away
        new Abc(true, 100000000);

        int i = 0;
        while (true)
        {
            Thread.Sleep(100);
            Console.Write(i++ + "...");

            // keep allocating memory so that GC will be forced ...
            new Abc();
        }
    }
}

如果您分配new Abc()给成员变量,而不是在本地范围内,您可以在哪里看到差异,例如:

public class Xyz
{
    Abc _abc;

    public Xyz()
    {
        new Abc(true, 100000000);
        Abc _abc = new Abc(true, 100000000);
    }
}

现在,如果你创建一个Xyzin Main,你会看到第一个Abc是 GC'd,而第二个不是。

于 2013-07-12T16:27:03.263 回答
5

他们都初始化一个对象

abc obj = new abc();

创建一个新实例并将其分配给一个变量

new abc();

这只是创建一个新实例,但不分配。

如果您只想在对象上调用方法,可以使用它

new abc().SomeMethod();

一旦它运行了它的方法,它就有资格使用 GC。但是你应该为此使用静态方法调用(没有理由实例化一些东西然后把它扔掉)

于 2013-07-12T16:27:28.053 回答
1

没有区别。第一个是将返回值保存在变量中。

于 2013-07-12T16:27:30.373 回答