码迷,mamicode.com
首页 > Windows程序 > 详细

C# 构造器

时间:2015-01-15 17:40:45      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:

/*content:C#构造器,终结器
 * new操作符implement(实例化)对象,构造器initialize(初始化)对象
 * new操作符返回实例化好的对象(虽然在构造器的生命或实现中没有显式的制定返回类型或使用返回语句)
 * constructor(构造器)是“运行时”用来初始化对象实例( object instance)的方法
 * 构造方法到CIL编译成一个.ctor的方法
 * 如果一个类不写继承自谁的话会默认为继承自System.Object,
 * 所以在调用构造函数的时候会调用System.Object的构造函数
 * instantiate实例化 instance实例  implement实现
 * 重点:1. 对象初始化器:就是在调用new一个实例化对象的时候,可以在后面用一对大括号{}里面对可以访问的字段或者是属性进行赋值操作
 * 2.集合初始化器:
 * 在定义一个类的时候要为所有的属性都提供一个有效的默认值,对于自动实现的属性药通过构造器设置默认值
 * 规范:构造器的参数使用camel风格,跟属性(pascal)只是差别在大小写不一样
 * 英语学习:anonymous匿名的
 * User: YuanWei
 * Date: 2015/1/12
 * Time: 13:39
 * 
 * 
 */
using System;
using System.Collections.Generic;

namespace LearningConsructor
{
    class Program//如果一个类里面的所有成员都是静态的,那么建议最好将这个类声明为静态的
    {
        public static void Main(string[] args)
        {
            
            // TODO: Implement Functionality Here
            //var employee=new Employee("ZhangSan",50);
            var employee=new Employee("ZhangSan",150){Age=23};
            /*重点掌握:
             * 对象初始化器:var employee=new Employee("ZhangSan",50){Age=23};
             *这个的好处就是有的时候你在创建一个对象的时候顺便将里面有些属性的值给传进去,可以代替重载构造
             */
            List<Employee> employees=new List<Employee>(){new Employee("Lisi",20),new Employee("WangWu",24)};
            /*集合初始化器:利用集合来进行的,如上所示
             *    
             */
            List<Employee> employeess=new List<Employee>(){new Employee("XiaoNiZi",160){Age=23},new Employee("YuanSi",179){Age=23}};
            /*集合初始化器和对象初始化器的结合使用
             *
             */
            var sne=new SecondNewEmployee();
            /*匿名类型:编译器遇到匿名类型的时候,会自动生成CIL类
             *调用匿名类型的构造器进行初始化,然后就可以像访问静态类型一样的访问里面的成员了
             */
            var animal =new {Name="Tigger",Type="Aniaml of Cat"};
            Console.WriteLine(employee.Name);
            Console.ReadKey(true);
        }
    }
    public class Employee
    {
        /*在调用构造函数进行实例化对象的初始化的时候,先调用的是再字段声明时候的赋值,
         *然后再去调用System.Object的构造器,然后一步步进行初始化,在初始化属性的时候
         * 在本类的构造方法中先调用的是set方法,一步步的来
         */
        public Employee(string name,int height)
        {
            this.Name=name;
            this.Height=height;
        }
        public string Name{get;set;}//在编译成CIL代码时会自动添加支持字段<Name>K_BackingField:Private string
        public int Height=20;/*在声明的时候进行的初始化,在构造函数调用进行初始化的时候会首先调用这一条指令,
         *在反编译的时候甚至是把这句放在构造函数的首句;*/
        public int Age{get;set;}
        //(构造器链)从一个构造器中调用类中的另一个构造器(针对相同对象的instance),如下:
        public Employee(int age,string name,int height):this(name,height)
        {
            this.Age=age;
        }
    }
    public class NewEmployee:Employee
    {
        /*
         *总结:如果基类没有包含无参的构造函数,继承自基类的所有派生类的构造函数都必须有参
         * 因为在调用自己类的构造函数的时候首先调用的是基类的构造函数,如果基类的构造函数需要参数的话,
         * 那么在子类的构造函数中就要给基类传参进去
         * 子类给基类传参用的是base,
         */
        public NewEmployee(string newName,int newHeight):base(newName,newHeight)
        {
            //Implement ClassMembers
        }
        public NewEmployee():base("ZhangHong",23)//正确,子类不一定要有参数,但是必须给基类传进去实参,此为无参的构造方法
        {
            //先将“ZhangHong加载,然后将23加载,然后再调用”
        }
//        public NewEmployee()//如果这样写的话是错误的,因为没有给基类传实参
//        {
//        }
        
    }
    public class SecondNewEmployee:NewEmployee
    {
        //因为基类有无参的构造函数,所以这样写的话是正确的,所以在调用此构造函数的时候会调用基类的无参的构造函数
        //如果在参数列表中进行初始化的话,在进行方法调用的时候可以不传实参进去,不会报错,那么使用的就是默认值了
        public SecondNewEmployee(string voice="",int?inteligent=null)
        {
            
        }
        public string Voice{get;set;}
        public int Inteligent{set;get;}
    }
}

 

C# 构造器

标签:

原文地址:http://www.cnblogs.com/vivieryuan/p/4226638.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!