C# C为什么/何时(而不是如何)要在类自身内部创建类的实例?

C# C为什么/何时(而不是如何)要在类自身内部创建类的实例?,c#,visual-studio,class,oop,C#,Visual Studio,Class,Oop,我是OOP新手,我刚刚开始我的C冒险。我最近遇到了一个关于StackOverflow的主题,有人问我如何在类本身内部创建类的实例 public class My_Class { My_Class new_class= new My_Class(); } 我的问题是我们为什么要做这样的事情?我试图在论坛上做一些搜索,但大多数讨论似乎都是关于如何不创建无限循环等 请举一个简单的例子,或者给谷歌一个关于什么短语的建议好的,一个简单的例子: class Human { Hu

我是OOP新手,我刚刚开始我的C冒险。我最近遇到了一个关于StackOverflow的主题,有人问我如何在类本身内部创建类的实例

public class My_Class
 {
      My_Class new_class= new My_Class();
 }
我的问题是我们为什么要做这样的事情?我试图在论坛上做一些搜索,但大多数讨论似乎都是关于如何不创建无限循环等

请举一个简单的例子,或者给谷歌一个关于什么短语的建议好的,一个简单的例子:

class Human 
{ 
    Human Father { get; set; } 
    Human Mother { get; set; } 
}
另一个:

class Employee
{
    Employee Manager { get; set; }
}
将类型与该类型的实例混淆。实例可以有不同的含义

另一个著名的例子是用于存储一个不会公开的类型实例,该实例用于所有静态方法或属性

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Singleton();
         }
         return instance;
      }
   }
}

在链表结构中有一个例子,您希望在同一个类中有一个实例。每个节点都有上一个和下一个节点的实例:

public class Node 
{
    Node next;
    Node previous;

    //...
}

很可能,这是在描述模式,您的程序只有一个类实例。在这种情况下,您倾向于从该类中实例化该类本身的单个实例

// naive implementation of singleton, but demostrates the basics
public class Singleton
{
    private static Singleton instance;
    static Singleton()
    {
         this.instance = new Singleton();
    }

    public static Singleton Instance{ get { return instance; } }
    private Singleton() {}

    public void DoSomething() { ... }
}
用法


您通常在实现的变体时执行此操作。但显然,问题中涉及的代码比您在问题中发布的代码要多一些


此外;不,这不会创建无限循环。如果您在同一类的构造函数中无条件地构造一个类的新实例,它将创建一个StackOverflowException。或者作为该问题字段的默认值。

许多答案已经回答了您问题的“如何”部分,因此我将只回答与大多数答案中提到的单例设计模式相关的“为什么”:

我的问题是我们为什么要做这样的事情


有时一个类只有一个实例很重要。例如,在一个系统中,应该只有一个窗口管理器,或者只有一个文件系统,或者只有一个后台打印程序。通常情况下,单例用于内部或外部资源的集中管理,它们为自身提供了一个全局访问点。-

链表、树……给出的许多答案都与单例模式有关。您的示例实际上会导致堆栈溢出异常。errr,您已经设法重新创建了静态class@Rob不完全是-这些方法是实例方法。正如我所说的,我提供了一个非常幼稚的单身汉。单身汉的概念让我更清楚了一点。我做了一些额外的阅读,这是有意义的。然而,我仍然对你提供的前两个例子有点困惑。你能用“人类”类来扩展这个例子吗?也许如果它有一些方法,它会更容易理解。@Szmal:什么让你困惑?一个人有很多属性,其中两个是他们的父亲和母亲,每个人都有。他们也是有父亲和母亲的人类。人类类还可以将子类列表作为属性,如果该人类没有子类,则该列表为空。一个员工可以有一个经理,如果不是CEO,也可以有一个经理,否则为空。哦,好的,我现在明白了。这似乎合乎逻辑。不知道混乱是从哪里来的。。。谢谢
Singleton.Instance.DoSomething();