当你只实例化" new objectName()"

时间:2016-04-07 06:59:33

标签: c#

我只是在C#上观看一些视频,然后遇到了一些我不理解的内容。让我们说我有一个班级

class person
{
    public string Name;
}

在我的主要代码中我放置

new Person()

未声明Person New =

它是否仅在堆上创建没有名称的对象的引用?这样做的目的是什么?

3 个答案:

答案 0 :(得分:7)

它为您创建一个没有引用变量名称的对象。 当你不想再次使用同一个对象时,你创建没有引用变量名的对象。

再一次 - 我的意思是如果你不打算在程序中的任何其他地方使用该对象。

答案 1 :(得分:3)

它创建一个对象,但没有像Bawa在上一个答案中所说的那样分配给任何变量。在这里,我想包括更多,这将解释我们如何确认它创建一个新实例:

让我在类中添加一个构造函数;并定义一个新的静态变量;这是为了维护实例编号;

public static int instanceConst = 0;
class person
    {
        public string Name;
        public person()
        {
            instanceConst++;
        }
    }

为每个实例instanceConst增加1。现在我们可以按如下方式检查它们:

int personInstanceNumber = 0;
var instant1 = new person();
personInstanceNumber = instanceConst; // personInstanceNumber=1
var instant2 = new person();
personInstanceNumber = instanceConst;// personInstanceNumber=2
instant1 = new person();
new person();
personInstanceNumber = instanceConst; // personInstanceNumber=4

这意味着创建了一个实例但是没有使用它;

答案 2 :(得分:2)

由于没有对象的引用,因此将很快收集对象并收集HOPEFULLY垃圾。但有一点需要注意。该对象的构造函数可以是任意复杂的。编译器不能只是优化语句,因为构造函数可能会反射到另一个程序集中,实例化HttpClient并发射导弹。它甚至可能将自己注册为其他类的成员,或者通过共享/全局状态注册到某个集合中。

你可以确定的一件事是:如果你看到代码库中的行只包含创建一个对象,然后没有在内联系中分配或传递它,那么你的设计气味非常糟糕。

编辑:以下是一些非常糟糕的代码示例,这些代码会导致对象“永远”存在

static class GlobalState
{
    public static IList<object> GlobalStuff = new List<object>();
}

class Hacker
{
    public Hacker()
    {
        GlobalState.GlobalStuff.Add(this);
    }

    public override string ToString()
    {
        return "hacker!!";
    }
}

class Program
{
    static void Main(string[] args)
    {
        new Hacker();
        Console.WriteLine(GlobalState.GlobalStuff[0].ToString());
    }
}