类的这种递归构造是如何工作的
本文关键字:何工作 工作 递归 | 更新日期: 2023-09-27 18:19:51
我正在读"Nutshell中的C#",有一段代码我无法理解:
class Foo
{
public static Foo Instance = new Foo();
public static int X = 3;
Foo() {
Console.WriteLine(X);
}
}
class Program
{
static void Main() {
Console.WriteLine(Foo.X);
Foo myfoo = new Foo();
Console.WriteLine(Foo.X);
}
}
问题:当我们调用构造函数"Foo-myfoo=new Foo()"时,会发生什么步骤?这个节目不是注定要失败吗?
根本没有递归。事实上,这是一种众所周知的模式,称为"singleton"。
实际上,代码甚至不会编译。构造函数是私有的(默认的访问修饰符是private
),因此创建Foo
实例的唯一可能方法是在Foo
类本身内部,这是通过以下操作完成的:
public static Foo Instance = new Foo();
因此,基本上,这段代码公开了Foo
的public static
实例,并且您不能构造任何其他实例,因为您不能从Foo
类本身之外调用构造函数。
public static Foo Instance = new Foo();
static关键字表示它属于类型而不是对象。
看起来像是一个singleton,静态Foo实例"instance"对所有项目都是相同的,所以它不是"递归的",如果它不是静态的,是的,你会因为分配无限个"Foo"实例吃掉所有的ram而遇到麻烦,但由于只有一个实例是共享的,所以代码没有问题
您提供的代码片段在main中显示,您将从Foo
类打印X
变量三次。
第二行您创建了foo
的实例,尽管您没有在其他任何地方使用过它。
请注意,您的第三行是Console.WriteLine(Foo.X);
如果您想使用从构造函数接收的结果(该结果将在创建foo对象(第2行)期间初始化),则必须使用Console.WriteLine(Myfoo.X)
行
我希望你的应用程序的输出是:
3
3
3
首先,它不会编译,因为构造函数不是公共的。
第二,不,这并不是注定的,它只是意味着将有两个Foo构建的实例。
第一个实例是创建对Foo的静态引用时。这将调用构造函数并输出0,因为代码还没有初始化静态变量X。
构造函数将再次被调用以构造Foo的第二个实例,但这一次静态变量将被设置为3,因此控制台输出将为3。
就是这样。
正如其他人所指出的,构造函数是私有的,以强制执行singleton模式。因此,应该通过静态类变量来访问实例。
Foo foo = Foo.Instance;
这样做的问题是,当静态变量X输出到控制台时,它将为0,因为实例的构造是在初始化X之前。