最近在看C#高级编程 第六版,看到80页了。有一个地方不能理解public class MyNumber
{
   private int number;
   private MyNumber(int number)
   {
      this.number=number;
   }
}
书上说由于使用了private关键字,所以不能在外部用new来实例化。还说这样做的目的有两种:1、类仅用作某些静态成员或属性的容器,因此永远不会实例化。2、希望类仅通过某个静态成员函数来实例化,也就是所谓的对象实例化的类代理方法。请问上面两点该如何理解?谢谢

解决方案 »

  1.   

    public class MyNumber 

     static MyNumber _instance = null;
    readonly static object _locker = new ();
      private int number; 
      private MyNumber(int number) 
      { 
          this.number=number; 
      }   public static MyNumber GetInstance(int number)
    {
    lock(_locker)
    {
     if(_instance == null)
    {
     _instance = new MyNumber(number);
    }
    }
    return _instance;
    }
    } 使用时
    MyNumber myNumber = MyNumber.GetInstance(5);
    这只是例子,但对于这种数字为参数的,这么做是不理想的。
      

  2.   

    因为是private的所以除了类本身其他都不能实例化,但是正式因为这样就可以保证在程序中只有一个MyNumber的实例(必须加锁),如果我们想保存MyNumber中的成员的信息,就非常方便,这也是设计模式中的单例模式的引用
     public class SystemSession
        {
            private static SystemSession instance;
            private static object syncLock = new object();
            protected SystemSession()
            {
              
            }
             public static SystemSession GetInstance()
            {
                if (instance == null)
                {
                    lock (syncLock)
                    {
                        instance = new SystemSession();
                    }
                }
                return instance;
            }
    }
    这样能保证SystemSession.GetInstance()这个实例在程序中只有一个,这种单例在某些情况下很有用
      

  3.   

    真受不了CSDN,回复都那么困难。我来站一下巨人肩膀总结一下:
    一般情况下:利用new关键字调用构造函数MyNumber(int number)such as:MyNumber myNumber = new MyNumber(1);_在构造函数是共有的前提下,都会在内存中创建一个MyNumber类型的实例。而构造函数在默认情况下都是public的,除非自己编写构造函数再将其定义为私有——这样客户代码将无法使用new关键字实例出对象,而只有类本身才能有访问构造函数的权限(new关键字)。1、类仅用作某些静态成员或属性的容器,因此永远不会实例化。解释:类的静态成员不需要实例化。所以类的设计者不想让客户程序可以实例出该类的对象。
    2、希望类仅通过某个静态成员函数来实例化,也就是所谓的对象实例化的类代理方法。 解释:上述两位施主就给了很好的demo。类的设计者希望通过其他方式实例出类的对象,而不使用new 关键字
      

  4.   


    public class MyNumber 

      private int number; 
      private MyNumber(int number) 
      { 
          this.number=number; 
      } 
    } 不能MyNumber myNum1=new MyNumber(10);
    但是可以MyNumber myNum1=new MyNumber();
      

  5.   

    谢谢楼主的朋友们,解决了我的一个疑问,非常感谢。
    顺便指出楼上的一个bug不能MyNumber myNum1=new MyNumber(10); 
    但是可以MyNumber myNum1=new MyNumber();这句话不对,因为C#中一旦自定义了带参数的构造函数,系统就不会提供无参数的默认构造函数。