C# C为什么/何时(而不是如何)要在类自身内部创建类的实例?
我是OOP新手,我刚刚开始我的C冒险。我最近遇到了一个关于StackOverflow的主题,有人问我如何在类本身内部创建类的实例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
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();