C#学习笔记

一..NET基础

CLR:公共语言运行库

CTS:通用类型系统

CLS:公共语言规范

 

受CLR管理的代码称为托管代码,否则称为非托管代码

 

二.类型与变量

数据类型分为:值类型与引用类型

值类型有:数值、枚举、结构体

引用类型有:接口、类、委托、字符串、数组

 

值类型在栈中分配内存空间并保存数据;

引用类型在堆上分配内存空间并保存数据,且在栈中保存指向堆中的数据地址;

 

装箱:值类型转换为引用类型;

拆箱:引用类型转换为值类型;

 

常量:Const标识,在声明时就必需初始化,且不能更改,通过类名来访问;

 

变量:

Static:初始化一次并持续保存在内存空间中,可反复读写;

Readonly:仅允许在声明时或所在类的构造函数中初始化,其它地方不可更改;

 

Static Readonly与Const的区别:

Static Readonly可在构造函数中初始化,而Const则不行;

Static Readonly在运行时分配内存空间,而Const则在编译时分配内存空间;

 

三.运算符

运算符重载定义方法如下:

Public static 类型 opearator 运算符(类型1,类型2);

注意:运算符重载方法的访问修饰符必需为Public static

 

四.条件与循环

条件语句:1.if-else        2.switch

循环语句:1.while          2.do-while        3.for          4.foreach

 

跳转语句:

Break:跳出循环或分支;continue:跳过本次循环并继续执行下一次循环;

Goto:跳转到指定的标签处(不建议使用);

Return:退出所在方法,并直接返回或返回值,不限深度;

 

五.类

类访问修饰符

Public 公共不受限访问,同程序集或引用该程序集中的其它程序集中类内外部均可访问;

Private 私有访问,仅限在类内部访问;

Protected 受保护访问,仅限在类内部及其子类内部中可访问;

Internal 在同一个程序集中类内外部均可访问;

Protected internal 在同一个程序集的类内部及其子类内部中可访问;

注意:默认不添加修饰符,则表示以Internal形式访问

Sealed 密封,不可继承;

Abstract 抽象,必需继承,若是抽象成员则在子类中需用override重写该成员;

Statict 静态密封,不可实例化,且不可继承;

 

在命名空间中定义的元素(类,接口,结构体,委托等)无法显式地声明为 private、protected 或 protected internal

 

构造函数:

1.可重载;2.没有声明则编译后默认生成无参且空实现的构造函数;3.构造函数名与类名相同;

4.无返回值;

作用:通过NEW相应的构造函数来实例化一个对象;

 

静态构造函数:

1.不能使用访问修饰符;2.有且只能定义一个无参构造函数(即:不能重载);3.只会执行一次;

作用:初始化类中静态成员;

 

析构函数:

  1. 无访问修饰符;2.有且只能定义一个无参析构函数;3.不能重载;4.由垃圾回器GC自动调用;5.结构体不能定义析构函数;

 

索引指示器:

定义方法:修饰符 类型 this[索引参数列表,…]

注意:索引指示器访问修饰符不能为static

 

六.类与结构体区别

1.类是引用类型,结构体是值类型;

2.结构体不能在声明字段时进行初始化,而必须在构造函数中进行初始化,而类不受限制;

3.类默认的无参构造函数在显式声明后则不存在,而结构体中不能显式声明,所以一直存在;

4.结构体仅可实现接口,不能继承类或结构体,而类可以继承类也可实现接口;

5.结构体不能声明为abstact、sealed、static,而类均可以;

6.结构体可以直接不用new声明对象,但未赋值的字段不可用,而类必需则通过NEW来实例化对象;

七.面向对象

三大基本特性:

封装:把客观事物封装成类,并隐藏类的内部实现细节,仅开放相关的访问属性、方法等

继承:通过继承可以复用父类的代码;

多态:1.允许将子对象赋值给父对象,2.同方法在不同的对象上有不同的实现方式;

 

子类初始化顺序:初始化类的实例字段à调用父类构造函数à调用子类构造函数;

 

重写:父类声明为virtual或abstract的类成员(属性、方法),在子类继承时必需使用override关键字进行重实现(虚方法视情况可不重写)。重写一般发生在父类与子类之间;

 

注意:虚拟成员或抽象成员不能是私有的,且重写时不能改变其访问修饰符(即:虚拟成员或抽象成员若为public,重写时不能改为protected,反之一样是不行的)

 

重载:相同的方法名称不同的形参类型或个数(注意:返回值类型不能做为重载的依据);

 

隐藏(覆盖):子类使用new关键字定义父类同名的方法,即可隐藏父类同名的方法,隐藏后,子类外部不能直接访问父类隐藏的方法,若需访问,必须将子类型强制转换成父类型才能正常访问;

 

所有类的最高层父类都是object类,即所有类都间接派生于object类;

 

八.接口

  1. 仅可定义属性、事件、方法、索引器4类成员,且定义的成员不能添加任何访问修饰符,因为默认都为public,子类继承并实现这些成员时也必须定义为public;
  2. 支持多重继承,可继承多个接口,但不能继承类;
  3. 可显式实现接口,显示实现的成员默认为私有private,不能添加任何访问修饰符,故不能通过类的对象进行访问,若需访问,则必需将对象的类型强制转换为相应的接口才能正常访问,这与类的隐藏方法类似,显示实现接口方法的语法:接口.接口方法(形参表表) { ..方法实现…}

 

九.接口与抽象类的区别

1.接口定义关键字为:interface,而抽象类定义关键字为:abstract

2.接口不能定义字段、构造函数、析构函数,不能使用任何访问修饰符(包含static,sealed,virtual等),而抽象类不受限制;

3.接口允许多重继承,而抽象类仅支持单继承;

4.接口一般用来定义通用的行为规范,指示所有继承的类必需具备这些行为,表现为:Can Do,而抽象类一般用来对一类对象的抽象进行描述,指示所有继承的类都属于该抽象类,并具备抽象类的所有特性,表现为:IS;

 

十.委托

1.委托是一种类型delegate,可以理解为对方法的包装,它使得可以将方法作为参数被传递,相当于C++中的函数指针;

2.委托的定义与方法的定义类似,只是多了一个delegate关键字,定义的语法如下:

访问修饰符 delegate 返回类型 委托名(形参列表)

3.实例化委托必须保证被委托的方法的方法签名(形参个数、顺序、类型)以及返回类型与委托定义相同;

4.委托链:+=表示添加方法到委托链中,-=表示从委托链中移除方法;

 

事件也是一种委托类型,定义时必需先定义委托类型,然后才能定义事件,事件的定义语法如下:

访问修饰符 event 委托类型 事件名;

事件通过+=订阅事件,-=取消订阅

 

十一.参数传递

默认情况下,值类型在方法中是按值传递,即将实参的值复制给形参,两者中任何一个的值改变不会改变另一个的值;

引用类型在方法中是按引用传递,即实参将变量的的引用地址传递给形参,两者均指向同一个对象,任何一个的值改变,则另一个也会变化;(字符串虽为引用类型,但由于其特殊性,默认情况下,在方法中是按值传递)

通过添加rel或out关键字来显式实现参数(不论任何类型)按引用类型传递,其中使用rel关键字时,实参必需先初始化,而out关键字则没有此要求;

 

十二.泛型

泛型代表的就是通用类型,它可以代表任意类型,使类型参数化,从而实现同一个方法可以操作不同的类型的目的;

泛型解决了类型之间装箱与拆箱的问题;

浮型约束采用where 关键字,如:where T:class,约束是为了将泛型的类型具体化。

约束种类如下:

引用类型约束(T:class),确保传递的类型实参必须为引用类型;

值类型约束(T:struct),确保传递的类型实参必须为值类型(不包括可空类型);

构造函数约束(T:new()),确保传递的类型实参必须有公共的无参构造函数,此约束适用所有非静态、非抽象的包含无参构造函数的类型(值类型与引用类型),如果有多个约束,则此约束必须放在最后面;

转换类型约束(T:基类名,T:接口名,T:U),确保传递的类型实参必须是继承该约束的类或接口;

组合约束,包含多个约束;

赞(0)
未经允许不得转载:TaKaSa » C#学习笔记

相关推荐