关于单例的非静态成员的问题(C#)

mat*_*dev 7 c# singleton static design-patterns

我有一个关于单身人士的问题,我认为我知道答案......但每次情况弹出时我都会稍微猜测一下自己,所以我想知道具体的答案.

假设我有两个类设置如此...

 public class ClassA
 {
     private static ClassA _classA;

     public static ClassA Instance { get { return _classA ?? LoadClassA(); } }

     private ClassA(){}

     public static ClassA LoadClassA()
     {
         _classA = new ClassA();
         return _classA;
     }

     private ClassB _classB = new ClassB();

     public ClassB ClassB { get { return _classB; } set { _classB = value; } }
 }


 public class ClassB
 {
 }
Run Code Online (Sandbox Code Playgroud)

我的问题很简单.

我想知道如果我访问ClassA的单例,_classB字段是否也被视为静态?即使我没有将_classB声明为静态成员.

我总是基本上猜到_classB它被视为静态(一个内存位置),但我想知道肯定.我错了吗?每次从singleton ClassA访问时都会为_classB创建一个新对象...即使内存中只有一个ClassA?或者是因为我在声明上新建了_classB,导致只有一个实例?

提前谢谢,-Matt

Ree*_*sey 11

创建单例时,您将创建一个非静态类型的静态实例.

在这种情况下,您的类型(A类)包含对另一种类型(B类)的引用.静态实例将保存对B类对象的单个实例的单个引用.从技术上讲,它不是"静态的",但由于它的根源是静态对象(类A实例),它的行为就像一个静态变量.您将始终拥有一个且仅有一个B类对象(由A类实例指向).您永远不会在A类中创建多个B类实例.

但是,没有什么能阻止在其他地方生成第二个B类实例 - 这将是一个不同的实例.

  • 除非我在这里看到错误,否则你还应该为`ClassA`创建一个私有构造函数.如果不这样做,就不会有任何阻止外部代码创建"ClassA"的新实例的东西,这将意味着更多的"ClassB"实例(因为每个"ClassA"将具有独立的副本). (4认同)