大侠帮我看看下哪里有理解不
第四章
0:15个预定义类型,13个值类型,2个引用类型(string,object),类也是引用类型。00:封箱,拆箱:封箱可以把值类型转换为引用类型,拆箱可以把引用类型转换为值类型1:静态方法或静态变量:
对于一些经常使用的方法或函数,用static。减少内存
调用static:直接类名.方法名,不用new实例化类,然后类名.方法名2:引用类型的比较运算符在默认状态下不是比较数据的内容,
而是测试这两个引用是否指向内存中相同的地址。3:把字段设置为private,外部用户看不见他们,这样,
我们可以修改类的内部工作方式,而不会影响使用这个类的其他代码。
用这种方式把字段应藏在客户机代码中的法则称为数据封装。
例如:
private string name;
public string Name{ get{return name;} set{name = value;} }
当不用name的时候可以改为id或什么,而调用的时候没影响4:protected:protected int minute,基类和派生类都可以调用这个minute,
但不是派生于定义变量的那个类,这个成员是不可见的。5:C#不允许派生类重写某个方法,除非该方法在基类中声明为virtual.
例如:
基类:
 public virtual void RecordCall(TypeOfCall type, int minute)//虚方法,为派生类重写;C#不允许派生类重写某个方法,除非该方法在基类中声明为virtual.
        {
            switch (type)
            {
                case TypeOfCall.CallToLandLine:
                    balance += (0.02M * minute);
                    break;
                case TypeOfCall.CallToMobile:
                    balance += (0.5M * minute);
                    break;
                default:
                    break;
            }
        }
派生类:
 public override void RecordCall(TypeOfCall type, int minute)//重写方法RecordCall,当调用的时候会覆盖基类的RecordCall
        {
            switch (type)
            {
                case TypeOfCall.CallToLandLine:
                    balance += (0.02M * minute);
                    break;
                case TypeOfCall.CallToMobile:
                    int highCostMinute, lowCostMinute;
                    int highCostMinuteTogo = (highCostMinuteUsed < 60) ? 60 - highCostMinuteUsed : 0;
                    if (minute > highCostMinuteTogo)
                    {
                        highCostMinute = highCostMinuteTogo;
                        lowCostMinute = minute - highCostMinute;
                    }
                    else
                    {
                        highCostMinute = minute;
                        lowCostMinute = 0;
                    }
                    balance += (0.5M * highCostMinute + 0.2M * lowCostMinute);
                    break;
                default:
                    break;
            }
        }#:虚方法:
(1).可以在子类选择性的重写; (2).不重写也可被子类调用;
(3).静态方法不能声明为virtual,声明为virtual是没有意义的6:抽象函数:
(0)现在每次定义一个类时,我们都会创建这个类的实例,但也有例外。
     在一些情况下,我们会定义一个非常基本的类,再从中派生其他专用的类,
     但实际上又不想使用这个类。C#为此提供了abstract.如果一个类声明为abstract,
     就不可能实例化它.例:abstract class MyBase{}
(1)抽象类不仅在语法上很方便,
     而且可以确保在外部编译时检查程序中已提供的所有相关方法的重写。
(2)抽象类中的抽象方法不可以有方法体,抽象类中的抽象方法在子类中必须重写;7:密封的类或方法:
抽象类或抽象方法表示该类[必须]被重写或继承,密封类或密封方法[不能]被重写或继承
在方法中使用sealed是没有意义的,除非这个方法是基类中方法的重写
例如:
 public sealed override FinalMethod(){}11:重写override:
继承时发生,在子类中重新定义父类中的方法,子类中的方法和父类的方法是一样的
例如:基类方法声明为virtual(虚方法),派生类中使用override申明此方法的重写.
有返回值的重写返回return base.方法名()
例如:
public override int calcute()
        {
            return base.calcute();
        }12:C#隐藏:
基类方法不做申明(默认为非虚方法),在派生类中使用new声明此方法的隐藏。
访问父类则调用父类的方法,子类子类的方法。
(1)函数名字相同               
    (2)如果参数类型不同的时候,有无virtual 关键字都为隐藏               
    (3)如果参数类型相同,则,无virtual 关键字时为隐藏第五章13:重载:
(1) 在同一个类里面               
   (2) 函数名字相同               
   (3) 函数参数不同               
   (4) virtual 关键字有无均可
10:构造函数:
(1)构造函数的方法名和类名相同
(2)构造函数没有返回类型
(3)实例构造函数负责:初始化类中的实例变量,它只有在用户用new关键字时才被调用。而且作为引用类型的类
 例如:
private string ConnStr = null;
public MysqlHelp()
        {
            ConnStr = ConfigurationManager.ConnectionStrings["StudentConnections"].ConnectionString;
        }
        public SqlConnection ReturnConn()
        {
            SqlConnection Conn = new SqlConnection(ConnStr);//当new的时候就调用了MYsqlHelp
//给ConnStr赋值,这样就无需在调用MysqlHelp()方法
            Conn.Open();
            return Conn;
        }
参造:http://www.cnblogs.com/sopper/archive/2006/04/12/373430.html