Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象创建和初始化之间有什么区别吗?_C#_Oop - Fatal编程技术网

C# 对象创建和初始化之间有什么区别吗?

C# 对象创建和初始化之间有什么区别吗?,c#,oop,C#,Oop,例如,我有classAbc,并且为它创建了一个默认构造函数 这两种语法的区别是什么 Abc obj = new Abc(); 及 唯一的区别是,第二个对象不包含对已创建对象的引用,因此它将立即符合垃圾收集的条件 只有当GC认为“obj”超出范围不再可到达时,第一个才有资格获得GC 编辑 就OP而言,很难证明两者之间真的有任何区别。试着运行这个程序,你会发现1和2都不是GC'd class Program { public class Abc { byte[]

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

这两种语法的区别是什么

Abc obj = new Abc(); 


唯一的区别是,第二个对象不包含对已创建对象的引用,因此它将立即符合垃圾收集的条件

只有当GC认为“obj”超出范围不再可到达时,第一个才有资格获得GC


编辑

就OP而言,很难证明两者之间真的有任何区别。试着运行这个程序,你会发现1和2都不是GC'd

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);
    }
}

现在,如果您在
Main
中创建
Xyz
,您将看到第一个
Abc
是GC'd,而第二个不是。

它们都初始化了一个对象

abc obj = new abc();
创建新实例并将其分配给变量

new abc();
这只是创建一个新实例,但不分配

如果您只想对对象调用一个方法,那么可以使用它

new abc().SomeMethod();

一旦它运行了它的方法,它就有资格使用GC。但是您应该为此使用静态方法调用(没有理由实例化某个东西并将其扔掉)

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

它们都有效地返回对对象的引用。您只需忽略第二个示例中的返回。构造函数仍将被调用。作为旁白,请注意副作用!如果您正在考虑更改全局变量、运行其他方法等,作为创建类的新实例的副作用,请不要这样做。如果您真的想在不依赖类实例的情况下完成任务,只需使用静态类即可。我不知道这是否是你的目的,但我只是想确定一下!实际上,在引用变量超出源代码范围之前收集实例是很有可能的。有关详细信息,请参阅。挑剔:事实上,第一个对象一旦不再使用,就有资格使用GC,这可能比引用范围的结束要快得多。@BrianRasmussen对,我记得Eric Lippert读到GC将收集任何对象,如果它能“证明”该对象不再可用。
new abc().SomeMethod();