最近学习C#,讲到C#的私有构造函数时,有一些疑问。
示例代码:
class circle
{
  private circle()
  {
    //do somthing...
  }
  private circle(double x)
  {
    //do somthing...
  }
}class myapp
{
  public static void Main()
  {
   //do somthing...
  }
}
1.如果不编写自己的构造函数,每一个应该有一个默认的构造函数。
  我写了构造函数以后,应该是重载OVERLOAD了构造函数,而不是覆盖默认的构造函数,为什么使用
  circle first = new circle(); 
  时编译器不会去寻找默认的构造函数来创建对象呢。
2.对于构造函数内的代码,是否没有意义了呢?比如示例中的private circle()内部的代码是不是永远无法执行。
3.private circle(double x),是否也同疑问2,其内部代码无法执行。

解决方案 »

  1.   

    class circle
    {
        private circle()
        {
            System.Console.WriteLine("circle()");
        }    private circle(double x)
        {
            System.Console.WriteLine(x);
        }    public circle(double x, double y) : this(x+y) // 可以访问自己的私有成员
        {
        }
    }class myapp
    {
        public static void Main()
        {
            // circle first  = new circle();     // 错误,不能访问私有成员。
            // circle second = new circle(2);    // 错误,不能访问私有成员。
            circle third  = new circle(1,2);     // 可以。
        }
    }
      

  2.   

    1.如果不编写自己的构造函数,每一个应该有一个默认的构造函数。 
      我写了构造函数以后,应该是重载OVERLOAD了构造函数,而不是覆盖默认的构造函数,为什么使用 
      circle first = new circle();  
      时编译器不会去寻找默认的构造函数来创建对象呢。 
    -----------------------------------------------------
    你没有写构造函数的话,编译器才默认给你添加一个公用的构造函数,你写了的话是不会添加的。
    2.对于构造函数内的代码,是否没有意义了呢?比如示例中的private circle()内部的代码是不是永远无法执行。
    ----------------
    不是永远没办法执行,例如:class circle 
    { private static c = new circle(); // 这里就执行了 private circle() 
      private circle() 
      { 
        //do somthing... 
      } 
      public circle(double x) : this() // 这里就执行了 private circle() 
      { 
        //do somthing... 
      } 

     
    3.private circle(double x),是否也同疑问2,其内部代码无法执行。 
    ------------------
    和问题2一样,参数不一样而已
      

  3.   

    私有的构造函数,就是不被外部实例化,也就不能new出来。
      

  4.   

    又不是单例干嘛把构造函数 private
      

  5.   

    构造函数没有必要写成private的,一般对数据封装就可以了
      

  6.   

    有时候对象总是只有一个实例,例如软件的选项对话框等
    此时这样调用更习惯:frmOption.ShowDialog(),省去的构造对象的语句
    而这样做的话可以把frmOption封装成私有构造函数,而ShowDialog封装成静态函数,在其内部调用其私有构造函数
      

  7.   

    感觉在绝大多数情况下不需要私有构造函数,public就够了。