类的这种递归构造是如何工作的

本文关键字:何工作 工作 递归 | 更新日期: 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();

因此,基本上,这段代码公开了Foopublic 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之前。