c#中构造函数调用构造函数的目的是什么?)仅仅是赋值的话,那所有重载的构造函数都一样了?其实我认为不是为了赋值,用this关键字调用其他构造函数,在调用此构造函数的时候先执行被调用的构造函数,之后执行本身这个构造函数,       
 public Employee(string name): this("aaa", 5000)//调用两个参数的构造函数,真不知道this中改怎么写,索性就赋值了
        {
            this.name = name;
        }
        public Employee(string name, int salary)
        {
            this.name = name;
            this.salary = salary;
        }
       //ok,开始调用构造函数实例化对象
       Employee w2= new Employee("bbb");//很显然的被调用的构造函数中的属性(aaa)会被覆盖掉
                                        //说明了什么?构造函数调用构造函数目的根本不在此
按我的理解,构造函数之间的相互调用,是为了少写部分代码(对象存在公共属性),初始化一些共同的属性,但是这些公共的属性为什么又不声明为静态的常量呢?
        public Employee(string name, int salary)
        {
            this.educational = "Undergraduate ";//假如类中有一个学历信息,这里且认为都是本科教育程度
            this.name = name;
            this.salary = salary;
        }
       //那么在构造调用构造的时候,
         public Employee(string name): this("aaa", 5000)
        {
            this.name = name;
        }
       //用这个构造实例化的对象“学历”这一属性都将是本科
       //这仅仅是我的理解,可能不对,但是我认为构造函数的相互调用绝不是赋值那么简单
       //OK,现在问题又出来了,既然需要所有对象都是“本科”这一学历,那么为什么不把“学历”这一属性
       //直接定义为静态的且初始化的状态(“本科”)?似乎我自己又推翻了自己的结论因为今天看的代码中有这样重载构造函数的//算了,公司的代码不贴了构造函数调用构造函数这种实现方式的实质是什么?为什么这么设计?我还是想进一步探索,欢迎大家共同探讨。顺祝大家周末愉快,欢迎讨论,谢谢!

解决方案 »

  1.   

    你可以想象一下如果一个winform界面里如果有20多个控件,那么对此初始化的代码如果全放在一个分件里,那么页面初始化的代码就已很拥挤,
    为什么这么设计:
    在.net里已用partial关键字使其一个类的初始代码可以与业务逻辑代码分文件进行存放。但是在编译时编译器会自动合为一个文件。
      

  2.   

     Employee w2= new Employee("bbb");//很显然的被调用的构造函数中的属性(aaa)会被覆盖掉
                                            //说明了什么?构造函数调用构造函数目的根本不在此-------------------------------------------------------------------------------
    你最好先运行一下你的代码,然后在提问
      

  3.   

           Employee w2= new Employee("bbb");//很显然的被调用的构造函数中的属性(aaa)会被覆盖掉
                                            //说明了什么?构造函数调用构造函数目的根本不在此----------------------------------------
    的确,name被覆盖了,但salary获得了默认的一个值。
      

  4.   

    public Employee(string name): this(name, 5000)//传参数
    {
    }
    public Employee(string name, int salary)
    {
    this.name = name;
    this.salary = salary;
    }
      

  5.   

    恨不得我把公司的代码贴出来,貌似libinguest的回答有所启示,我看的程序是winform程序
      

  6.   

    但是还有一个问题,用this调用构造函数时该怎么赋值?一定要复赋值?怎么给出属性类型本身默认的值(非据以的值,比如说我写的aaa,5000)我感觉我的表达能力太有限了
      

  7.   


    那我问下 什么叫 被调用的构造函数中的属性(aaa)会被覆盖掉
      

  8.   


    调用构造函数时赋值this("aaa", 5000),我Employee w2= new Employee("bbb");实例化出来的对象可以得到salary=5000这一属性,但是我调用的是只有一个属性的构造函数,同时赋值为bbb,结果this("aaa", 5000)中的aaa属性没有了,但是5000依然保留,所以我推断aaa被“覆盖”了,或许我主观臆断,加上用词不当,多谢指教!
      

  9.   

    是这样的
    public Employee(string name): this("aaa", 5000)
            {
                this.name = name;
            }
            public Employee(string name, int salary)
            {
                this.name = name;
                this.salary = salary;
            }
    Employee w2= new Employee("bbb");会先运行 Employee("aaa", 5000),然后运行Employee("bbb");
      

  10.   

    http://lcring.blog.51cto.com/195827/33978也是找这个问题时候反出来的帖子
      

  11.   

    我猜你想说的是函数重载(overload)
      

  12.   

    结果this("aaa", 5000)中的aaa属性没有了
    -----------------------但这个地方的说法实在是有问题...
      

  13.   


    构造函数调用构造函数是为了减少重复代码有2个构造函数 
    public Employee(string name);
    public Employee(string name, int i)
    你把大量对类初始化的代码都放在public Employee(string name, int i)
    因为类初始化都相似, 这样就可以让public Employee(string name);
    调用public Employee(string name, int i) 来实现初始化,而不会在public Employee(string name);
    里面吧详细的初始化代码也写一遍。this 关键字调用的是该类的构造函数,base调用的是基类的构造函数。
    public Employee(string name): this("aaa", 5000)
    是public Employee(string name, int i) 函数体内的代码先执行,然后再执行 public Employee(string name);
    函数体内的代码
    jianu》》 ”这些公共的属性为什么又不声明为静态的常量呢?“
    不能写成静态常量,因为静态常量是所有类成员都共享这个常量,实际上每个实例的该变量可能不相同的。
      

  14.   


    掉构造函数 你可以把this 看成是函数名Employee
    怎么赋值 看你Employee函数参数是怎么定义的,
    可以不赋值,就是你必须要有一个 无参 构造函数 Employee();
    属性类型本身的默认值? 你可以添加一个无参构造函数 Employee()
    int型默认是0 string 默认是null
      

  15.   


    虽然在执行顺序上很相像,但性质迥然。代码应该做如下修改:
    public Employee(string name): this("aaa", 5000){}        public Employee(string name, int salary)
            {
                this.name = name;
                this.salary = salary;
            }
      

  16.   

    你把功夫练错了public Employee(string name)
    {
        this.name = name;
    }
    public Employee(string name, int salary): this(name)
    {
        this.salary = salary;
    }
      

  17.   

    重载构造函数的目的是...为customer服务...如果你没有把自己当作provider,甚至没有把自己当作customer,你当然感觉不到这样做的好处...那么你不需要重载构造函数,直到你意识到这一点以后再这样做吧...