《2022年C基础知识点剖析.docx》由会员分享,可在线阅读,更多相关《2022年C基础知识点剖析.docx(59页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、名师归纳总结 精品学习资料 - - - - - - - - - - - - - - - C# 基础学问点1、数据类型 1.1 、值类型、引用类型 1.2 、预定义类型 1.3 、类型转换 1.4 、装箱和拆箱 2、变量、常量 2.1 、变量 2.2 、常量 3、运算符和表达式 3.1 、运算符、表达式 3.2 、特别运算符 3.3 、优先级别 4、流程掌握 4.1 、条件语句 4.2 、循环语句 4.3 、跳转语句 4.4 、反常处理 5、程序结构 5.1 、类 5.2 、命名空间1 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 1 页,共 42
2、页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -5.3 、Main 方法6、程序例子7、作业一 数据类型1.1 值类型、引用类型C# 的数据类型可以分成两大部分:值类型和引用类型;值类型的变量总是直接包含着自身的数据,指向实际数据的地址;而引用类型的变量是C# 值类型包括:整型、布尔型、实型、十进制型、结构和枚举、接口和数组;从概念上看, 其区分是值类型直接储备其值,而引用类型储备对值的引用;这两种类型储备在内存的不同地方:值类型储备在堆栈中,而引用类型储备在托管堆上;留意区分某个类型是值类型仍是引用类型,由于这种储
3、备位置的不同会有不同的影响;例如,int是值类型,这表示下面的语句会在内存的两个地方储备值20: / i 和 j 都是整型变量i = 20; j = i; 但考虑下面的代码; 这段代码假定已经定义了一个类 class1 ,class1是一个引用类型,它有一个 int 类型的成员变量 Value:2 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 2 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - - class1 x, y x = new class1 ; x.
4、Value = 30; y = x; Console.WriteLiney.Value;/ 输出 30 y.Value = 50; Console.WriteLinex.Value;/ 输出 50 要懂得的重要一点是在执行这段代码后,只有一个 class1 对象; x和 y 都指向包含该对象的内存位置;由于x 和 y 是引用类型的变量,声明这两个变量只是保留了一个引用而不会实例化给定类型的对象;由于 x 和 y 引用同一个对象,所以对 亦然;因此上面的代码会显式 30 和 50;假如变量是一个引用,就可以把其值设置为何对象: y = null; x 的修改会影响 y,反之null ,确定它不引
5、用任在 C#中,基本数据类型如 bool 和 long 都是值类型;假如声明一个bool 变量,并给它给予另一个bool 变量的值,在内存中就会有两个bool 值;假如以后修改第一个bool 变量的值,其次个bool 变量的值也不会转变;这些类型是通过值来复制的;相反,大多数更复杂的 C#数据类型,包括我们自己声明的类都是引用类型; 它们安排在堆中,其生存期可以跨多个函数调用, 可以通过一个或几个别名来拜访; CLR(Common Language Runtime公共语言运行库指 .NET的运行时支持,3 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - -
6、第 3 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -包括一个面对对象类型系统和一些运行时服务)执行一种精细的算法来跟踪哪些引用变量仍是可以拜访的,哪些引用变量已经不能拜访 了;CLR会定期进行清理,删除不能拜访的对象,把它们占用的内存 返回给操作系统;这是通过垃圾收集器实现的;1.2 预定义类型C#认可的基本预定义类型并没有内置于语言中,而是内置于 .NET Framework中;例如,在 C#中声明一个 int类型的数据时,声明的实际上是 .NET结构 System.Int32 的一个实例; C#
7、支持两个预定义的引 用类型,如下表:CTS:公共类型系统名CTS 类说明称ObjecSystem.根类型,其他类型都是从它派生而来的 包括值类型 t Object StrinSystem.Unicode 字符串g String 1. object类型在 C#中,object 类型就是最终的父类型,全部内在和用户定义的类 型都从它派生而来; 这是 C#的一个重要特性, object 类型就可以用4 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 4 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - -
8、 - - - - - - - - -于两个目的: 可以使用 object引用绑定任何特定子类型的对象; object类型执行很多基本的一般用途的方法,包括Equals 、GetHashCode、GetType 和 ToString;用户定义的类可能需要使用一种面对对象技术重写,供应其中一些方法的替代执行方法;例如,重写 ToString 时,要给类供应一个方法,该方法可以供应类本身的字符串表示;假如类中没有提供这些方法的实现, 编译器就会在对象中挑选这些实现,它们在类中的执行不肯定正确;2. string 类型C#有 string关键字,在翻译为 .NET类时,它就是 System.strin
9、g;有了它,像字符串连接和字符串复制这样的操作就很简洁了: string str1 = Hello ; string str2 = World; string str3 = str1 + str2; / 字符串连接对是一个引用类型; String尽管这是一个值类型的赋值,但string象保留在堆上,而不是堆栈上;因此,当把一个字符串变量赋给另一个字符串时,会得到对内存中同一个字符串的两个引用;但是,string与引用类型在常见的操作上有一些区分;例如,修改其中一个字符串,留意这会创建一个全新的string对象,而另一个字符串没有转变;考虑下面的代码:5 细心整理归纳 精选学习资料 - - -
10、- - - - - - - - - - - - 第 5 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - - using System; class StringExample public static int Main string s1 = a string; string s2 = s1; Console.WriteLines1 is + s1; Console.WriteLines2 is + s2; s1 = another string; Console.WriteLines1 is now
11、+ s1; Console.WriteLines2 is now + s2; return 0; 其输出结果为:s1 is a string s2 is a string s1 is now another string s2 is now a string 换言之,转变 s1 的值对 s2 没有影响,这与我们期望的引用类型 正好相反;6 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 6 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -1.3 类型转换1.
12、隐式转换 隐式转换就是系统默认的、不需要加以声明就可以进行的转 换; 隐式转换一般不会失败,转换过程中也不会导致信息丢 失;隐式转换包括下面几种:2. 显式转换 显式类型转换,就是强制类型转换;与隐式转换正好相反,显 式转换需要用户明确指定转换的类型,不如看下面例子: long l = 5000; int I = intl; 显式转换可以发生在表达式的运算过程中;它并不是总能成 功,而且经常可能引起信息丢失;显式转换包括全部的隐式转 换;显式转换包括下面几种:7 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 7 页,共 42 页 - - - - -
13、 - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -1.4 装箱和拆箱装箱和拆箱使我们可以把一个值类型当作一个引用类型看待;装箱转换是指将一个值类型隐式的转换成一个Object 类型,拆箱转换是指将一个 Object 类型显式地转换成一个值类型, 他们互为逆过程;装箱( boxing )装箱转换是指将一个值类型隐式转换成一个 object 类型,或者把这个值类型转换成一个被该值类型应用的接口类型;把一个值类型的 值装箱,也就是创建一个 object 实例并将这个值给这个 objet. 不如: Int i = 10; Object obj =
14、i; 拆箱( unboxing )拆箱转换是指将一个对象类型显式转换成一个值类型,或是将一 个接口类型显示地转换成一个执行该接口的值类型;拆箱的过程分为两步:第一,检查这个对象的实例,看它是否为 给定的值类型的装箱值; 然后,把这个实例的值拷贝给值类型的变量;8 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 8 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -如: Int i = 10; Object obj = i; Int j = intobj; 二 变
15、量、常量2.1 、变量在 C#中声明变量使用下述语法:datatype identifier; 例如: int i; 一旦它被声明之后, 就可以使用赋值运算符 = 给它安排一个值: i = 10; 仍可以在一行代码中声明变量, 并初始化它的值: int i = 10; 假如在一个语句中声明和初始化了多个变量,相同的数据类型: int x = 10, y =20; 那么全部的变量都具有要声明类型不同的变量, 需要使用单独的语句; 在多个变量的声明中,不能指定不同的数据类型: int x = 10; bool y = true; int x = 10, bool y = true; / 1. 变量
16、的初始化这样编译报错细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 9 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -变量的初始化是 C#强调安全性的另一个例子;简洁地说,C#编译器 需要用某个初始值对变量进行初始化,之后才能在操作中引用该变 量;大多数现代编译器把没有初始化标记为警告,但 C#编译器把它 当作错误来看待; 这就可以防止我们无意中从其他程序遗留下来的内 存中猎取垃圾值;C#有两个方法可确保变量在使用前进行了初始化: 变量是类或结构中的字段,假
17、如没有显式进行初始化,在默认 状态下当创建这些变量时,其值就是 0; 方法的局部变量必需在代码中显式初始化,之后才能在语句中 使用它们的值;此时,初始化不是在声明该变量时进行的,但编译器会通过方法检查全部可能的路径,假如检测到局部变量在初始化之前就使用了它的值,就会产生错误;同样的规章也适用于引用类型;考虑下面的语句: Something objSomething; 在 C#中,这行代码仅会为Something 对象创建一个引用,但这个引用仍没有指向任何对象;对该变量调用方法或属性会导致错误;在 C#中实例化一个引用对象需要使用new关键字;如上所述,创建一个引用,使用 new关键字把该引用指
18、向储备在堆上的一个对象: objSomething = new Something; / This creates a Something on the heap 2. 变量的作用域变量的作用域是可以拜访该变量的代码区域;一般情形下, 确定作用10 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 10 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -域有以下规章: 只要字段所属的类在某个作用域内,其字段 也称为成员变量 也在该作用域内局部变量存在于表示声明该变
19、量的块语句或 方法终止的封闭花括号之前的作用域内; 在 for 、while 或类似语句中声明的局部变量存在于该循环体 内;局部变量的作用域冲突 大型程序在不同部分为不同的变量使用相同的变量名是很常见的;只要变量的作用域是程序的不同部分,就不会有问题, 也不会产生模糊性;但要留意, 同名的局部变量不能在同一作用域内声明两次,所以 不能使用下面的代码: int x = 20; / 其它代码 int x = 30; 字段和局部变量的作用域冲突在某些环境下,可以区分名称相同 尽管不是经过完全限定的名称 、作用域相同的两个标识符; 此时编译器答应声明其次个变量;缘由是 C#使得变量之间有一个基本的区分
20、, 它把声明为类型级的变量看作是 字段,而把在方法中声明的变量看作局部变量;11 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 11 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -2.2 、常量在声明和初始化变量时,在变量的前面加上关键字 const ,就可以把该变量指定为一个常量; 顾名思义, 常量是其值在使用过程中不会发生变化的变量: const int a = 100; /变量的值不能转变C#中只能把局部变量和字段声明为常量;常量具有如下特点: 常量
21、必需在声明时初始化;指定了其值后,就不能再修改了; 常量的值必需能在编译时用于运算;因此,不能用从一个变量 中提取的值来初始化常量; 假如需要这么做,应使用只读字段; 常量用易于懂得的清晰的名称替代了 符串” ,使程序更易于阅读; 常量使程序更易于修改;例如,在“ 含义不明确的数字或字C#程序中有一个 SalesTax常量,该常量的值为 6%;假如以后销售税率发生变化,可以把新值赋给这个常量, 就可以修改全部的税款运算,而不必查找整个程序,修改税率为0.06 的每个项; 常量更简洁防止程序显现错误;假如要把另一个值赋给程序中 的一个常量,而该常量已经有了一个值, 编译器就会报告错误;12 细心
22、整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 12 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -三 运算符和表达式3.1 、运算符、表达式算术操作符和算术表达式加法操作符减法操作符 * 乘法操作符 / 除法操作符求余法操作符例:加法表达式 Enum Weekday Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday; Weekday day1 = weekday.Sunday; Weekday d
23、ay2 = day1+2; Console.WriteLineday2; 结果是: Tuesday 赋值运算符 * / & 是最简洁的赋值运算符,其它的是复合赋值,X 5 等13 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 13 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -价于 X X5;关系运算符 等于!不等于 大于 = 大于等于 Is 运算符 Is 元算符被用于动态的检查运行时对象类型是否和给定的类型兼容;运算“ e is T” 的结果,其中, e
24、 是一个表达式, T 是一个类型,返回值是一个布尔值;它表示,转换,胜利的转换于 T 类型;如:1 is int 结果是: true As 操作符e 是否能通过引用转换,装箱 As 操作符通过引用转换或装箱转换将一个值显式地转换成指定的引用类型;不像显式类型转换,as 不会产生任何反常;假如转换不行以进行,那么结果值为 null ;形如“e as T ” 的运算, e 是一个表达式, T 是一个引用类型;返回值的类型总是 T 的类型,并且结果总是一个值;如: . as string; 14 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 14 页,共
25、 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -虽然,字符型不能转换为字符串类型,程序可以通过,不过有一个警 告;位运算 & | 与或异或 取补 右移3.2 、特别运算符三元操作符?:先运算条件 b ,然后进行判定;如条件表达式 b . x : y ,果 b 的值为 true, 运算 x 的值,运算结果为 x 的值;否就,运算 y, 运算结果为 y 值;一个表达式,从不会即运算 x 值,又运算 y 值;条件表达式是向右关联,例如: a . b : c . d: e 将按 a . b: c . d : e的形式
26、执行;自增和自减操作符就是对变量自身加一或者减一,留意,自增和自减运算符必需是对一个变量,一个属性拜访器,一个索引拜访器,而不能是常量或其表达式,如:5,15 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 15 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -(x+y)+ 都是非法的;自增和自减操作符有前缀和后缀之分,前缀遵循“ 先增减,后使用” ,后缀遵循“ 先使用后增减”; New 操作符一般用于创建一个新的类型实例,如: class A A a = n
27、ew A; 改运算符仍有其它更多的用法,详细如下:在 C# 中,new 关键字可用作运算符、修饰符或约束;1)new 运算符:用于创建对象和调用构造函数;这种大家都比较熟悉,没什么好说的了;2)new 修饰符:在用作修饰符时,继承的成员;new 关键字可以显式隐匿从基类3)new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型;关于其次种用法看下例:using System; namespace ConsoleApplication1 public class BaseA public int x = 1; 16 细心整理归纳 精选学习资料 - - - - - - - - - - -
28、- - - - 第 16 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - - public void Invoke Console.WriteLinex.ToString; public int TrueValue get return x; set x = value; public class DerivedB : BaseA new public int x = 2; new public void Invoke Console.WriteLinex.ToString; new public int
29、 TrueValue get return x; set x = value; 17 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 17 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - - class Test static void Mainstring args DerivedB b = new DerivedB; b.Invoke;/ 调用 DerivedB 的 Invoke 方 法,输出: 2 Console.WriteLineb.x.ToString
30、;/ 输出 DerivedB 的成员 x 值:2 BaseA a = b; a.Invoke;/ 调用 BaseA的 Invoke 方法,输出: 1 a.TrueValue = 3;/ 调用 BaseA的属性 TrueValue ,修改 BaseA的成员 x 的值 Console.WriteLinea.x.ToString;/ 输出 BaseA的成员 x 的值: 3 Console.WriteLineb.TrueValue.ToStri ng;/ 输出 DerivedB 的成员 x 的值,仍旧是: 1 / 可见,要想拜访被隐匿的基类的成员变量、属性或方法,方法就是 将子类造型为父类,然18 细
31、心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 18 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -/ 后通过基类拜访被隐匿的成员变量、属性或方法; new约束指定泛型类声明中的任何类型参数都必需具有公共的无参数 构造函数 . 请看下例 : using System; using System.Collections.Generic; namespace ConsoleApplication2 public class Employee private str
32、ing name; private int id; public Employee name = Temp; id = 0; 19 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 19 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - - public Employeestring s, int i name = s; id = i; public string Name get return name; set name = value; public int
33、ID get return id; set id = value; class ItemFactory where T : new 20 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 20 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - - public T GetNewItem return new T; public class Test public static void Main ItemFactory EmployeeFactory = new I
34、temFactory; /此处编译器会检查Employee是否具有公有的无参构造函数; / 如没有就会有 The Employee must have a public parameterless constructor 错误; Console.WriteLine0ID is 1., EmployeeFactory.GetNewItem.Name, EmployeeFactory.GetNewItem.ID; 21 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 21 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料
35、- - - - - - - - - - - - - - - Typeof 操作符用于获得系统原形对象的类型;如: typeofint 等于int32. Checked 和 unchecked 操作符 Checked 和 unchecked 操作符用于整形算术运算时掌握当前环境中的溢出检查; Const int x = 1000000; Const int y = 1000000; Return checkedx * y / 3.3 、优先级别编译时会报溢出错误当一个表达式包含多个操作符时,操作符的优先级掌握着单个 操作符的求值次序;22 细心整理归纳 精选学习资料 - - - - - - -
36、- - - - - - - - 第 22 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -23 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 23 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -四 流程掌握4.1 、条件语句条件语句可以依据条件是否满意或依据表达式的值掌握代码的执行分支; C#有两个分支代码的结构: if语句,测试特定条件是否满意; switch 语
37、句,它比较表达式和很多不同的值;1. if 语句语法都是特别直观的:if condition statements else statements 仍可以单独使用 if语句,不加 else 语句;也可以合并 else if子句,测试多个条件;2. switch 语句switch . case 语句适合于从一组互斥的分支中挑选一个执行分支;其形式是 switch 参数的后面跟一组case 子句;假如 switch 参数中表达式的值等于某个 case 子句旁边的某个值, 就执行该 case 子句中的代码;此时不需要使用花括号把语句组合到块中;只需使用 break语句标记每个 case 代码的结尾即
38、可; 也可以在 switch 语句中包含一个 default 子句,假如表达式不等于其他 case 子句的值,就执行default 子句的代码;下面的 switch 语句测试 integerA 变量的值:24 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 24 页,共 42 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - - switch integerA case 1: Console.WriteLineintegerA =1; break; case 2: Console.WriteLineintegerA =2; break; case 3: Console.WriteLineintegerA =3; break; default: Console.WriteL