1.概述:分配对象,研究封装的作用,定义类属性以及静态成员,对象初始化语法,只读字段,常量和分布类作用。
2. PrintState()相当于一个调试功能,它只把当前类的状态转储到命令窗口。
3. 使用new关键字来初始化类,如果不使用new而在以后使用类变量的话将导致编译错误(why)
4. 默认构造函数 和C++差不多
5. 自定义了构造函数后一定要在定义一个默认的构造函数,哪怕是空的都行,因为自定义构造函数会移除默认构造函数。
6. this关键字的一个用法:解决当前传入参数的名字和类型数据字段的名字相同时产生的作用域歧义。类级别没有this这个当前对象指针。
7. this关键字的另一用法:串联构造函数链,在.net 4 中,可以利用默认参数的构造函数来等效串联构造函数链(可以利用指定可选参数来调用)
8. static : 方法:只能调用类中的static变量或者static方法,通常用于工具类中。
字段:所有类的实例共享,只分配一次内存。跟C++一样
静态构造函数:初始化在编译时未知的静态数据的值,一个类只能定义一个静态构造函数,无论创建多少个实例,都只执行一次,什么时候调用:创建首次创建类实例或者首次访问静态成员,执行先于任何实例级别的构造函数
类:静态类不能用new创建,只能包含static的成员或者方法,可以防止被实例化,通常叫工具类,以前可以用private将默认构造函数私有或者用abstract标记类,现在用static更简洁。
9. OOP的支柱:封装,继承,多态。161
封装:隐藏对象的内部实现并保护数据完整性
继承:代码重用,is a/has a
多态:使你用同样的方式处理相关的对象,一个类类型的多态接口由任意个虚拟(virtual)或抽象(abstract)成员组成
虚拟成员:基类成员可以被派生类重写
抽象方法:基类提供签名式,必须被派生类重写
10.下面开始研究封装的细节:
11.c#访问修饰符
C#访问修饰符 可以用到的地方 作用
Public: 类型或类型成员 任何派生类和外部程序集
Private: 类型成员或者嵌套类型 定义他们的类或结构
Protected: 类型成员或者嵌套类型 任意子类
Internal: 类型或类型成员 当前程序集
Protected internal:类型成员或者嵌套类型 定义他们的程序集,类以及派生类
12.类中,方法和属性的默认访问权限是private
13.嵌套类型是直接声明在类或结构作用域中的类型(private,protected,protected internal可以应用到嵌套类型)
14. 表示对象状态的类成员都不应该标示为public;例如
一部3000万页的小说几乎不可能,但是外部赋值Int,语法上说得通。
15. 封装的属性(private)可以用传统的get,set方法访问,也可以用.net的属性来封装(value是上下文关键字,不是C#关键字)
public stringName(自己定义的类居然不用using和头文件?)//注意这里是Name
{
get{ return empName;} //这里是empName
set
{
//Here, value is really a string.
if(value.Length> 15)
Console.WriteLine("Error! Name must be less than 16 characters!");
else
empName= value;
}//属性在CIL中映射为get_Name()方法,如果你再写一个get_Name方法会发生编译错误
}//同理set方法
真正访问时,直接用 emp.Name = "Marv";就可以访问了,里面的get和set会自动调用。一旦创建了属性,对外界来说就好像是获取或设置公共数据点一样。
构造函数对于数据的检查就可以用数据的属性
public Employee(string name, int age, int id, float pay, string ssn)
{
//Better! Use properties when settingclass data.
// Thisreduces the amount of duplicate error checks.
Name= name;//这里就是对empName的set方法,就再写if15 else的检查代码了
Age= age;
ID= id;
Pay= pay;
SocialSecurityNumber= ssn;
}
Get和set的可见级别可设置为public等,读写属性:只读属性就不要set同理只写属性就不要get。静态属性在属性前加static
自动属性:public static string Name{protected get;set} //编译器自动附加其他的语句来实现属性。但是一定要get和set都有,换句话说,在自动属性中,不允许设置只读和只写属性。
class Garage
{
public Car MyAuto { get; set; }//自动属性
public Garage()
{
MyAuto= new Car();//Car类是引用,要在构造函数中调用new
NumberOfCars= 1;
}
}
16.对象初始化器语法:
Point finalPoint = new Point { X = 30, Y = 30}(公共字段或公共属性);等价于Point finalPoint = new Point (){ X = 30, Y = 30}(调用的是默认构造函数)
自动调用
// Create and initialize a Rectangle.
RectanglemyRect = newRectangle //自动初始化语法
{
TopLeft= new Point{ X = 10, Y= 10 }, //自动初始化语法
BottomRight= new Point{ X = 200, Y= 200 }//自动初始化语法;也许没有两个参数的构造函数,但是还是可以用这两个=号来初始化我想初始化的X和Y,所以不用仅限于别人提供的类的构造函数了
};
17. const常量数据:隐式为static类级,还有局部常量。编译时必须知道值。
Readonly 只读字段,运行时必须知道值(可以在构造函数中初始化,构造函数是在运行时执行)
Static readonly 静态只读字段可以用static构造函数初始化
18. 分部类型:partial 关键字,要求:类型名称必须相同,并且定义在相同的名空间中。
作用:一个产品级的类动辄上千行代码,写在一个文件中太长,而像字段数据,属性和构造函数在生产过程中很少变动,而方法却需要经常修改。
举例:
Class empoyee{方法,属性}
Partial class empoyee{方法,属性}