例如,我有类Abc
,我为它创建了一个默认构造函数。
这两种语法有什么区别?
Abc obj = new Abc();
和
new Abc();
答案 0 :(得分: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);
}
}
现在,如果您在Xyz
中创建Main
,您会看到第一个Abc
是GC,而第二个不是。
答案 1 :(得分:5)
他们都初始化一个对象
abc obj = new abc();
创建一个新实例并将其分配给变量
new abc();
这只是创建一个新实例,但不分配。
如果您只想在对象上调用方法
,则可以使用此方法new abc().SomeMethod();
一旦运行它的方法,它就有资格使用GC。但是你应该为此使用静态方法调用(没有理由实例化某些内容并将其丢弃)
答案 2 :(得分:1)
没有区别。第一个是将变量保留在变量中。