我只是在C#上观看一些视频,然后遇到了一些我不理解的内容。让我们说我有一个班级
class person
{
public string Name;
}
在我的主要代码中我放置
new Person()
未声明Person New =
它是否仅在堆上创建没有名称的对象的引用?这样做的目的是什么?
答案 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());
}
}