********************************封装******************************
1.内存模型:分为
1.1栈:储存引用类型的变量(地址) 由clr中控控制
1.2堆:数据区(多份储存)
1.3代码区(源数据):类定义,类字段定义,类方法定义,静态字段定义,静态方法定义,静态字段的数据
2.最好的原则是:(能不能访问,主要看,访问期间各个数据是否存在,静态数据时编译期就存在的,在数据区中,而实例的数据时运行期才有,堆中的东西一般都是运行期才有)
a.实例的方法访问实例成员
b.静态方法访问静态成员(也要符合封装的要求)
c.但实例不能访问静态的成员
d.静态函数只构造一次
3.数据在程序中传递时,无论是作为输入还是输出(使用数据之前,还是得到结果之后)都要谨慎验证数据的有效性;
尤其是对于对象的使用要验证其是否为null(著名的空引用异常)
4.在类实例化的时候,先调用静态构造函数,然后调用实例构造函数(载入内存,或者开辟内存,就是实例化)
******************************异常*********************************
1.
catch(FormatException fe)
{
...对fe异常进行处理
}
catch(overFlowException ofe)
{
..堆ofe异常进行处理
}
catch(Exception ex) // 最后都处理不了的异常有Exception来处理,加一个总保险
{
ex ....//来处理处理不了的异常,总保险
}
2.一般有多层继承时,子类继承的是最近一的上一层父类的成员
3.virtual于override要成对出现
3.当子类在进行构造的时候,首先构造父类,如后添加子类的其他东西(使用子类实例包含父类实例)---->滚雪球模式
4.
a.子类实例不会额外对父类进行copy,而是一种包含关系,所以子类Horse中的name,其实就是父类Animal中的name(只此一份)//除非Horse对name进行重写
b.子父类的源数据时分开存储的,但是数据时相互包容的
5.静态构造函数前不能加public(因为静态构造函数不是提供给外部调用的,而是持续自行调用的)
6. GetHashCode( )方法可以得到某个实例内存中的哈希地址,如果两个实例的哈希地址相同,则在内存中是同一个东西
7.子类调用父类的构造函数也相当于从类外调用,所以父类的构造函数不能为private
8.抽象类虽然不能实例化,但是可以放置一些标准以供后面的类使用
9.做类时,要让类的风格明确,根据功能加前缀,sealed,abstract,static,如:
public static class Tools // 如果不需要继承,只是作为工具,呢么可以是static类
{
public Tools ( ) { } // 静态类不能有实例化构造函数
}
10.兄弟类之间不能进行强行转换,只有父子类之间才能进行强制转换
11.类的功能分类
a.节点类
b.集合类
c.工具类
d.界面类
12.一个事物如果描述起来比较复杂就应该为其创建类
13.在设计程序的时候,尽量使用接口,使类于类,方法与方法之间可以相互独立,减少关联错误
15.使用基类引用调用子类实例方法,叫做多态:
a.抽象方法支持多态
b.方法重写不支持多态(当父引指向子实例的时候,调用的是父类方法)
c.虚方法(virtual)+override -->支持多态
d.虚方法(virtual)+new----->相当于方法重写,不支持多态
//接口引用页可以实现多态(接口其实就是一种只有功能的类)
16.当一个实例实现了某个接口,就可以被该接口强转,-->并且转换为只被该接口识别的内容
17.当使用接口作为参数时,不要去实现该接口而得到一个类型(因为C#的接口方法内部构造是很复杂的),而是要到类库中找到一个能识别,且已经实现了该接口的类型作为参数(就是继承了该接口的类型作为参数)
18.
( ( IshowPersonTwo)ider ).GetHashCode( ) //ider继承了IshowPerson接口的实例
//ider套一个IshowPersonTwo就相当于ider展示一下IshowPerson方面的功能
//用什么类型强转,就相当于让被转换的数据只保留目标类型的数据,如果是接口就是为了实现功能(接口也是类)
19.做接口的目的是就为了降低耦合性,增加独立性,所以一般接口不会进行继承
20.接口可以重写,但无实际意义
************************************IO************************************
1.”==“实际上比较的是两块数据的hashcode ,所以如果数据是同一个地址,呢么就是相同的。
2.重写不同于重载:
a.重载的方法签名是不一样的,因为参数的多少是不一样的
b.重写的参数应一致,一般对应virtual
3.char是个结构,string是个类
4.同一个文件上最好同时不要进行2个流的操作,否则会出错。