C#知识点总结
1、 Console.WriteLine():打印到控制台并换行
2、 C#类型:值类型、引用类型
3、 namespace:不同文件夹下的类可以属于同一个namespace
4、 字符串相加:使用(+)操作符,任何其他对象与字符串相加都会自动调用ToString()
5、 字符串存储:str1 = “111”; str2 = “111”,str1和str2指向同一地址
6、 字符串比较:只要str1和str2内容相同,str1 == str2表达式都会返回true。==操作符被String重载
7、 整型:byte、short、int、long,都有相应的有/无符号版本,其中byte是无符号的,其他是有符号的
8、 浮点型:float、double、decimal,只有有符号版本
9、 值类型中的数值型:都包含MinValue、MaxValue属性,可以直接由类型通过(.)操作符访问
10、 强制类型转换:(())操作符,如int i = (int)c;
11、 char:字符型,Unicode编码(16位)。可看作无符号整型,可以使用ushort以上的类型强制类型转换。
12、 char/Unicode码段常量:数字0-9(48-57),大写字母A-Z(65-90),小写字母a-z(97-122)
13、 特殊字符:’\t’-制表位;’\n’-换行符
14、 赋值语句/表达式:赋值语句在表达式中只计算左值,计算前已经将右值计算结果赋予左值
15、 bool:逻辑型,只有两个值,true/false
16、 出现在字符串中的双引号:写法为(\")
17、 数值、char、bool的Parse()方法:基础值类型都包含该方法,将字符串转为本类型变量
18、 数值型.Parse():参数如果不是数值,或者越界,将返回异常
19、 编译器捕获数值计算越界:在编译期判断是否越界,如果判断越界,则根本不可能编译成功
20、 未捕获的数值计算越界(如方法调用):则回到数值型范围开始处。即MaxValue + 1:MinValue
21、 sizeof:返回类型所占字节数。如,sizeof(int)返回4
22、 Framework类型与CLS(公共语言子集):所有类型都是定义在Framework中,语言本身没有类型
23、 值类型:结构(struct)、枚举(enum)
24、 C#预定义的13种值类型:.net结构的别名
25、 常用值类型别名:Int32-int,Char-char, Double-double,Boolean-bool
26、 常用类别名:Object-object,String-string
27、 struct:直接声明即可使用。如struct Person{……},Person bily; bily.name=”bily”;
28、 enum:一组预定义的值。
ü enum中的值为int型,不可定义为其他类型(比int小的类型会隐式类型转换)
ü 如果不指定数值,则从0开始递增1
ü 可以指定数值,此时,其后如果不指定数值,则在前一基础上递增1
29、 存储:栈,固定大小的存储空间,效率高;堆,不固定大小的存储空间,灵活性大
ü 栈:值类型、引用类型的句柄(地址值,32位机上是32位(4字节),64位机上8字节)
ü 堆:引用类型的对象
30、 引用类型:栈中存储句柄,堆中存储对象,句柄指向对象
31、 new:在堆中分配空间。所以,struct对象不用new,定义即可使用;class对象需要new
32、 string:是String类的别名,是一种非常特殊的类型
ü 创建对象:可以使用string s = new String(“111”)方式,也可以直接使用string s = ”111”方式
ü 内存开销:如果已经存在string s1 = “111”; 则string s2 = “111”; 直接返回s1句柄存储的地址
33、 赋值语句(=):在栈中实现一次复制,将右值赋值给左值
ü 引用类型的赋值语句:复制句柄存储的地址
34、 %:10 % -3是1;(10 / -3 = -3……1)
35、 bool:true/false,可以通过(1)定义bool型;(2)关系表达式;(3)逻辑表达式;(4)条件布尔表达式;(5)函数返回值获得,作为判断、循环语句的条件使用
36、 逻辑操作符
ü 非(!):取反,!true是false;!false是true
ü 与(&):两操作数都是true,结果才为true,其他为false
ü 或(|):两操作数都是false,结果才为false,其他为true
ü 异或(^):两操作数不同,结果为true,其他为false
37、 条件布尔操作符:&&与,||或,作用与逻辑操作符中的&,|完全相同,但采用部分运算,因此效率较高,在实际编程中也可以避免一些错误。
ü bool-expression1 && bool-expression2:如果bool-expression1是false,则不再计算bool-expression2
ü bool-expression1 || bool-expression2:如果bool-expression1是true,则不再计算bool-expression2
举例:
if (list != null && list.Count != 0) { },如果list是null,则list != null返回false,不再计算list.Count != 0;
if (list != null & list.Count != 0) { },当list为null时,list != null表达式返回false,list.Count != 0表达式会跑出NullReferenceException异常
38、 三元操作符(? :):obj = bool-expression ? obj1 : obj2;
ü bool-expression如果为true,则执行obj = obj1; 否则,执行obj = obj2;
39、 switch:开关语句。
ü 开关条件:整型(byte,short,char,int,long)、字符串
ü 执行描述:从第一个匹配的case起执行,到break/return语句出现为止
ü 要求:一旦某个case中包含执行代码,则必须break/return
40、 临时变量必须初始化后才能使用。PS:临时变量,方法、构造器等中出现的变量
41、 数组中的元素会被初始化
42、 数组元素访问越界,会产生IndexOutOfRangeException异常
43、 二维数组:理解为每一个元素都是一维数组的数组。设为biArr
ü biArr.Length:二维数组有多少个元素
ü biArr[i].Length:二维数组的第i个元素内有多少个元素
ü 访问二维数组的元素的元素,使用[][]操作符
ü 如果所选择的下标越界,将产生IndexOutOfRangeException异常
44、 变量的生存周期
ü 临时变量:从定义的那一行起,到靠它最近的{}结尾符止。生存周期以外,不可见
45、 方法原型:<返回值类型> <方法名> ([类型形参, 类型形参…]) {方法体}
46、 方法的特征:方法名、参数表(数量、类型、顺序)
ü 方法的返回值类型不在其列
ü 方法的参数名称不在其列
47、 VS操作[解决方案、项目、引用、Main方法]
ü 一个解决方案内可能包含多个项目,可以通过 [设为启动项目]来告知VS默认启动的项目,此时启动程序将选择默认启动的项目下的Main方法
ü 项目之间使用到彼此的类定义时,需要通过[添加引用]操作,将需要用到的项目引入本项目中
48、 static:属于类的
ü static类:只包含static成员
ü static成员:只能由类通过(.)操作符访问;不能通过对象来访问
ü 实例方法可以访问static成员,static方法不能访问实例成员
49、 const:常量,直接使用类通过(.)操作符访问,不能通过对象来访问。
ü const隐含了static定义
50、 readonly和cosnt的异同:
ü 异:(1)readonly修饰实例字段,const修饰类字段;(2)readonly可以在声明和构造函数两处赋值,const只能在声明时赋值。
ü 同:一经赋值,不可改变
51、 internal:C#顶层类(namespace下直接定义的类,而不是内部类)定义默认访问权限符
ü 当前项目内可以访问
52、 能够访问顶层类的权限符:public(所有项目均可见)、internal(本项目内可见)
53、 构造函数的原型:类名 ([类型形参, 类型形参…]) {方法体}
54、 构造函数
ü 如果不定义构造函数,编译器将生成默认构造函数(public、无参、无内容)
ü 只要定义构造函数,编译器将不再生成
55、 重载:[方法、构造函书] 名称相同、参数表不同
56、 类定义中,数据成员(即字段)是有默认值的
ü 数值型:0
ü 字符型:Unicode-0
ü bool:false
ü 引用类型:null
57、 构造器重载的this写法:以Book类为例,假设Book包含一个定义了名称和价格的构造器,此时重载一个只有名称的构造器。public Book(string name) : this(name, 0) { }
58、 构造器重载的设计思路:由简入繁,每次需要添加代码;由繁入简,每次需要传入默认值。
ü 使用第二种,先定义包含字段最多的构造器,重载包含字段较少的构造器时,使用this调用
59、 析构函数:在对象被释放前,由垃圾收集器调用
ü 写法为:~+类名,没有访问类型符、返回值类型、参数表
60、 面向对象三要素:封装、继承、多态
61、 C#访问权限符:private、protected、internal、internal protected、public
62、 类内部默认访问权限符:private
63、 protected internal:子类和当前项目内的类都能访问的权限,书写不分先后
64、 方法参数传递:ref和out的异同
ü 相同点:
n 方法定义和方法调用时都需要明确标识
n 属性不可作为ref/out参数传递
ü 不同点:
n out参数可以没有初值
n out参数在方法定义中必须被初始化
65、 delegate:委托,指向方法的指针
ü 与class、struct、enum平级,在namespace中定义
ü 定义原型:delegate 返回值类型委托名 (参数表);
ü 委托定义原型中,返回值类型和参数表正是方法原型的组成部分,委托也正是为指向具体方法而存在的。我们定义了一个委托后,可以使用该委托指向一个返回值类型和参数表都相同的方法,并通过委托执行该方法。
ü 委托的使用与类相同,使用new创建委托对象,但是需要传入方法名作为参数
66、 一个解决方案可以有多个项目,每个项目都可以且仅可以有一个含Main方法的类。如果一个项目中有两个Main方法,VS将提示“定义了不止一个入口点”,编译失败。
67、 类继承定义中,不允许派生类的可访问性比其基类更高。否则VS将提示“基类比派生类的可访问性低”,编译失败。
ü 基类public,派生类public/internal
ü 基类internal,派生类internal
68、 Object:所有类的基类,在C#中拥有一个别名:object
ü C#类体系为单根继承结构,所有类都直接或间接继承自Object,并包含一系列方法
n Equals,判断两个对象是否相等。默认判断两个句柄是否指向同一对象,故而总需要复写
n GetHashCode,返回对象散列码。如果复写了Equals,总需要复写GetHashCode,原则是Equals返回true时,GetHashCode必须返回相同的数值。
n GetType:返回类型信息
n ToString:作为字符串的展现
69、 调用继承类构造函数:基类如果没有默认构造函数,而派生类构造函数也没有显式调用基类构造函数,将无法通过编译。
70、 this和base
ü this
n 当前对象,类定义中所有实例方法、字段、属性等操作都默认隐含this标识符。
n 作为构造函数访问符,可以在构造函数定义中,调用本类其他的构造函数
ü base
n 基类对象,每个类的对象中都隐含包括了基类的子对象,可以通过base访问基类的成员
n 作为构造函数访问符,可以在构造函数定义中,调用基类的构造函数
71、 抽象类:abstract class,必须被继承并实现所有抽象方法后才能被实例化的类
ü 抽象类不能被实例化
ü 抽象类可以包含抽象方法;包含抽象方法的必须是抽象类
n 抽象方法(abstract method):只有方法声明,没有具体实现的方法。
ü 继承抽象类,必须实现其所有抽象方法,才可以实例化。如果不能全部实现,则派生类仍必须声明为抽象类
72、 密封类:sealed class:不能被继承的类
73、 接口:interface,纯粹的抽象类。注意:
ü 所有方法都是抽象方法(不可包含代码体)
ü 不允许使用访问修饰符修饰方法(包括public,尽管默认访问权限符就是public)
ü 不能包含字段成员,但可以包含属性声明
ü 不能使用static、virtual、abstract、sealed关键字修饰
74、 关于类的继承:
ü 只能继承自一个类,但可以继承多个接口
ü 同时继承自类和接口时,必须将基类写在前面,接口写在后面,中间用逗号隔开
75、 普通类的继承:
ü 子类方法默认不会覆盖父类方法,即假使父类和子类含有同样的方法声明,那么使用父类句柄访问对象的该方法,将调用父类的方法定义(不管对象实际上是父类对象还是子类对象)
ü 子类方法覆盖父类方法,需要显式将父类方法声明为virtual、子类方法声明为override
n virtual:虚方法,拥有具体实现,但是标识出该方法可能被覆写
n override:说明该方法覆写了父类的同名方法
76、 如果父类方法声明为virtual,而子类定义了同名方法,但是并不想覆写父类方法,此时需要在子类方法声明的最前方添加new标识符。
ü 如果不添加new,不会报错,只会报警告
77、 static成员不可被继承(override),但可能被隐藏
78、 抽象类的继承:抽象方法声明为abstract,实现抽象方法时,且必须声明为override
79、 接口的继承:实现接口方法不需要且不能添加override关键字
80、 覆写(override)方法时,派生类方法的访问权限不能发生改变(java:派生类方法的访问权限不能比基类的低)
81、 默认访问权限:类型(类、接口、结构等):internal;类的成员:private;接口的成员:public
82、 protected:子类可以访问到的成员
ü 包括整个基类体系的protected成员,并不只是直接基类的protected成员
83、 假如(1)interface I1, I2(2)class C : I1,I2(3)f(I1); f(I2);,此时,调用f(new C())将发生调用不明确错误
ü 解决方法:定义I1、I2接口的父接口,重写f方法。(1)I1:I、I2:I;(3)f(I)
84、 is:is表达式判别一个对象是否属于某个类型,如果是,返回true,反之,返回false
85、 as:强制类型转换的无异常写法。Cat c = (Cat)o; --<1>的as写法为:Cat c = o as Cat; --<2>。1、2功能相同,但是,如果o对象不是Cat类型,则1写法将抛出异常,2写法会自动将c赋为null
86、 多态:同样的代码,不同的行为
ü 针对基类型或接口定义行为,使用不同派生类的对象调用,将实现不同的行为
87、 extern:定义外部函数,通常用来引用外部DLL中定义好的方法。
ü 表示当前文件中使用的函数,在外部被定义
88、 typeof:获取类型的 System.Type 对象
ü 该关键字是Type类的别名
ü 该关键字直接作用于类型名,即typeof(TypeName),如果要通过对象获取其类型的Type对象,使用o.GetType()方法
91、 异常
C# 语言的异常处理功能提供了处理程序运行时出现的任何意外或异常情况的方法。异常处理使用 try、catch 和 finally 关键字来尝试可能未成功的操作,处理失败,以及在事后清理资源。异常可以由公共语言运行库 (CLR)、第三方库或使用 throw 关键字的应用程序代码生成。
技术点
l try…catch…finally:异常处理
l throw:显式抛出异常
l 自定义异常类:继承自Exception的类
注意点:
l 异常也是类,异常对象跟普通对象没有本质区别,只是专用来提示程序不正常
l finally块中的代码无论如何都会执行,不管是否发生了异常
catch可以捕获具体的异常,也可以不明确指出具体的异常。如果标识出要捕获的具体异常,则catch子句中列举的异常要从小往大罗列。