C程序设计基础课后笔记.docx
《C程序设计基础课后笔记.docx》由会员分享,可在线阅读,更多相关《C程序设计基础课后笔记.docx(18页珍藏版)》请在冰豆网上搜索。
C程序设计基础课后笔记
C#开发入门
一、.NETFramework
1、组成:
公共语言运行时(CLR)、.NETFramework基础类库(BaseClassLibrary,简称BCL)
2、NET应用程序不依赖于操作系统
3、公共语言运行时:
.NETFramework
的核心是它的执行环境,该环境即为它。
它主要负责管理.NET应用程序的编译、运行以及一些基础的服务;同时为应用程序提供内存分配、线程管理以及垃圾回收;负责对代码实施安全检查。
在CLR控制下的代码叫托管代码。
4、通用类型系统(CTS)
5、公共语言规范(CLS):
CTS子集,目的是让.NET平台上编写的对象之间可以互相调用,实现语言的互操作性
6、中间语言(CIL)
二、C#语言
1、不再支持对指针类型的支持,使得程序不能随便访问内存地址空间;不再支持多重继承
2、特点:
语言简洁、语言自由性、保留了C++的强大功能、强大的Web服务器控件、支持跨平台、及XML相融合
三、
1、解决方案名默认及项目名相同
2、项目归解决方案管理,program/类的扩展名为.cs
3、空格、括号、分号必须是英文
4、程序运行:
编译期、运行期
第一次编译后会生成.dll文件或.exe文件
C#编程基础
一、基本语法
1、格式:
程序代码分为结构定义语句、功能执行语句(最后用分号结束;);严格区分大小写
2、注释:
单行“//”多行“/*、*/”;多行不可以嵌套多行
3、标识符:
(大小写字母、数字、下划线、@符号组成,不能以数字开头,不能是C#中关键字)
a.类名、方法名、属性名每个单词首字母大写:
例ArrayList
b.字段名、变量名首字母小写,之后单词首字母大写:
例userName
c.常量名中所有字母大写:
例DAY_OF
d.尽量使用有意义单词定义标识符
4、关键字:
所有关键字均小写;标识符不能以关键字命名
二、常量
常量包括整型常量、浮点数常量、布尔常量、字符常量
1、整型常量:
二进制、八进制、十进制和十六进制
2、浮点数常量:
float单精度浮点数、double双精度浮点数(默认)
3、字符常量:
用('')引起来、可以是英文字母、数字、标点符号、以及由转义序列来表示的特殊字符例:
'a''1''&''\r''\u0000'
4、字符串常量:
表示一串连续的字符,用("")引起来例:
"HelloWorld""123""Welcome\nXXX"
一个字符串可以包含一个字符或多个字符,也可以不包含任何字符,即长度为零。
5、布尔常量即布尔型的两个值true和false
6、null常量
扩展:
(\)转义字符
\r:
回车;\n:
换行;\t:
制表符;\b表示退格符号;\‘表示单引号字符;\“表示双引号字符;\\表示反斜杠字符
三、变量
每个内存单元都用一个标识符来标识,这些内存单元我们称之为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值。
***值类型为数值;引用类型为地址
1、整数类型分为4种不同的类型:
字节型(byte)、短整型(short)、整型(int)和长整型(long)。
2、浮点数类型:
单精度浮点数(float)、双精度浮点数(double)
3、字符型char,占两个字节
4、布尔类型true、false
**强制类型转换:
目标类型变量=(目标类型)值
例如:
x=(int)z,x为int类型,z为long类型
Long类型不能直接转换成int类型,所以强制转换
**变量需要先定义,后使用。
它有自身的定义域
四、运算符
1、算数运算符
单目:
+(正号)、-(负号)、++、--
双目:
+、-、*、/、%(余数符号及除数有关)
2、赋值运算符:
(运算顺序从右往左)
=、+=、-=、*=、/=、%=
3、比较运算符:
==、!
=、<、>、<=、>=
4、逻辑运算符:
&(及)、|(或)、^(异或)、!
(非)、&&(短路及)、||(短路或)
同:
&及&&都为及,当且仅当运算符两边的操作数都为true,结果为true,否则为false
异:
&&使用时,若左边为false,右边则不进行运算;&左右两边都进行运算
***(^):
当两边布尔值相同时,结果为false;不同为true
5、位运算符(针对二进制数)
&(按位及):
除1&1为1之外,其余为0;
|(按位或):
除0&0为0之外,其余为1;
~(取反):
取相反数,如,对应值为11111001
^(按位异或):
两个二进制数进行异或,若二进制位相同,则为0,否则为1
如:
()^(00001011)=00001101,即13
《左移、》右移
6、优先级:
’’!
”>”算术”>”关系”>”&&”>”||”>”赋值”
五、选择结构语句
1、if语句
2、if…else语句
3、if…elseif…else语句:
适合于分级判断,如对考试成绩进行等级的划分
4、switch语句:
根据具体值做出判断,如根据输入数字,决定星期几
六、循环结构语句
1、while语句:
条件成立,执行;直到条件不成立,循环停止
2、do…while语句:
先执行代码,后执行while语句内的条件;当不满足while条件时,跳出循环
3、for语句:
4、跳转语句:
break语句:
*当出现在switch条件语句中,作用是终止某个case并跳出switch结构;*出现在循环语句中,作用是跳出当前循环
break出现在嵌套循环中的内层循环时,只能跳出内层循环
goto语句:
若想跳出外层循环,则需要对外层添加标记,然后使用goto语句
continue语句:
终止本次循环,但下次循环还执行
C#编程基础
一、方法
1、修饰符:
public、private(默认);
返回值类型:
若没有,则为void;
方法名(每个单词首字母都为大写);参数名;return关键字(用于结束方法以及返回方法指定类型的值);
扩展:
intAbs(intvalue):
求绝对值;doublePow(doublex,doubley);doubleSin(doublex);doubleCos(doublex)
2、方法的重载:
针对同一方法传入不同参数
c#允许在一个程序中定义多个同名方法,但是参数的类型或个数必须不同
扩展:
判断方法重载:
将方法名前的修饰符、返回值类型以及方法体去掉;将方法参数列表中的参数名去掉
二、方法高级应用
1、递归调用:
在方法内部调用自身的过程(递归要求必须有结束条件)
2、params参数:
让方法调用任意个类型相同的函数;一个方法中只允许有一个,且该参数放到最后
3、ref参数:
由于方法里定义的变量是局部的,只在方法内部起作用,在方法调用时传递的值只是将数据复制了一份给方法,方法内对数据的修改不影响方法外的数据。
**如果希望外面变量保留修改后的值,使用ref参数;这种传递方式叫引用传递(传递的是变量的地址)
4、out参数:
将值从方法体内传到方法体外。
放到参数列表最后
扩展:
out参数也可以让方法返回多个值
三、数组
1、数组静态初始化:
2、常见操作:
数组的遍历:
依次访问数组中每个元素;数组最值;数组排序(外层循环次数为arr.Length-1)
3、多维数组
四、程序调试
设置断点;单步调试:
逐语句(F11)即进入方法内部调试、逐过程(F12);观察变量;条件断点
面向对象基础
一、面向对象三大特征:
封装性、继承性、多态性
二、类及对象
1、类的定义:
类中可以定义字段和方法,字段描述对象特征,方法描述对象行为
定义在类中的变量为字段,定义在方法中的为局部变量;含Main方法类为主类,此方法为程序入口
2、new关键字创建对象
(当没有任何变量引用这个对象时或者说变量的值为null,它将成为垃圾对象,不能再被使用。
)
3、属性(特殊字段)
在程序中,使用属性封装字段时,需要将字段访问级别设为private,并通过对属性的get,set访问器来对字段进行读写操作。
三、访问修饰符
public最高访问级别。
protected保护访问级别,受保护的成员可由自身及派生类访问。
internal内部访问级别,只有在同一程序集中,内部类型或者成员才可访问。
private最低访问级别
访问修饰符可以修饰类和方法,还有字段、属性、索引器、但不可以修饰命名空间、局部变量、方法参数
四、构造方法
定义:
方法名及类名相同,在方法名的前面没有返回值类型的声明,在方法中不能使用return语句返回一个值
构造方法也可以重载
扩展:
每个类至少有一个构造方法,若没有,系统会默认为这个类创建一个无参数构造方法;一旦为该类定义了构造方法,则不再提供默认构造方法
五、this关键字
局部变量优先于属性。
访问属性this.属性名;访问成员方法this.方法名访问构造方法:
this(参数1,参数2…)
六、索引器(若想访问多个数据成员,使用索引器。
索引器是类的特殊成员)
七、
垃圾回收:
(调用GC.Collect()方法)
嵌套类:
外部类及嵌套类的非静态成员可以重名,在对非静态成员访问时,需要先创建它所在类的对象。
*在嵌套类内不能声明静态成员,但在嵌套类可以直接引用外部类的静态成员
匿名类:
应用于使用次数少,没必要创建实例时。
它继承自System.Object类
对象初始器:
(应用于属性过多时)
八、static关键字(静态字段静态属性静态方法静态构造方法类名.静态成员名)静态构造方法只能为静态字段赋值
单例模式:
指在设计一个类时,需要保证整个程序在运行期间只存在一个实例对象
面向对象高级
类的继承:
类的继承是面向对象中一个非常重要的特征,在编写一个新类时可以通过继承一个类的方式来自动拥有该类中所有的成员(除构造方法和析构方法以外),这在程序的开发过程中可以极大地提高代码的复用性,同时也便于对程序功能的扩展。
在C#中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有的类被称作父类,子类会自动拥有父类所有可继承的属性和方法。
注意:
在类的继承中,需要注意一些问题,具体如下:
●继承具有单一性,也就是说一个类只能有一个直接的父类,例如下面的语句是错误的。
●多个类可以继承同一个父类,例如下面的语句是正确的。
●在C#中,多层继承是可以的,即一个类的父类可以再去继承其他类,例如C类继承自B类,B类又继承自A类,这时,C类也可称作A类的子类,下面的语句是正确的。
当一个类的对象被创建时,如果该类拥有父类的话,在调用自身构造方法的同时还会调用父类的构造方法,子类在实例化对象时,首先会调用父类的构造方法,然后再调用自身的构造方法。
其具体执行过程如下图所示。
子类在继承父类时可以对父类的成员进行扩展,如果子类中出现及父类同名的方法,那么在调用该方法时程序就不能明确该方法是属于父类还是子类,这时编译器就会提示使用new关键字隐藏基类方法。
装箱及拆箱
在实际开发过程中,某些方法的参数类型为引用类型,但是如果调用时传入的是值类型,此时需要进行装箱操作。
同样当一个方法的返回值类型为值类型,但实际方法返回值为引用类型,那么就需要进行拆箱操作。
简单来说,装箱就是将值类型转换为引用类型,拆箱就是将引用类型转换为值类型。
注意:
装箱和拆箱过程本质上是数据存储在栈及堆之间变更,因此频繁的装箱拆箱操作会影响运算效率,所以要尽量减少相关操作。
sealed关键字修饰类
在C#中,使用sealed关键字修饰的类不可以被继承,也就是说不能派生子类,这样的类通常被称作密封类。
sealed关键字修饰方法
当一个类的方法被sealed关键字修饰后,这个类的子类将不能重写该方法。
重写父类方法
在继承关系中,子类会自动继承父类中的方法,但有时父类的方法不能满足子类的需求,那么可以对父类的方法进行重写。
当重写父类的方法时,要求子类的方法名、参数类型和参数个数必须及父类方法相同,而且父类方法必须使用virtual关键字修饰,子类方法必须使用override关键字修饰。
注意:
子类重写父类方法时,不能使用比父类中被重写的方法更严格的访问权限,如父类方法的访问修饰符是public,子类的方法就不能使private修饰。
base关键字
1、调用父类的字段和方法
具体语法格式如下:
2、调用父类的构造方法
base关键字不仅可以调用父类的字段和方法,还可以调用父类的构造方法,具体语法格式如下:
1、子类对象可以直接赋值给父类变量
例如下面这两行代码,将子类对象当做父类类型使用的情况,就可以直接进行赋值。
父类对象赋值给子类变量时需要进行强制类型转换
在C#中提供了一个Object类,它是所有类的父类,即每个类都直接或间接继承自该类
抽象类
(当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法的实现方式是无法确定的。
)
C#允许在定义方法时不写方法体,不包含方法体的方法为抽象方法,抽象方法必须使用abstract关键字来修饰,具体示例如下:
当一个类中包含了抽象方法,该类必须使用abstract关键字来修饰,使用abstract关键字修饰的类为抽象类,具体示例如下:
在定义抽象类时需要注意:
包含抽象方法的类必须声明为抽象类,但抽象类可以不包含抽象方法。
另外,抽象类是不可以被实例化的,因为抽象类中有可能包含抽象方法,抽象方法是没有方法体的,不可以被调用。
如果想调用抽象类中定义的方法,则需要创建一个子类,在子类中实现抽象类的抽象方法。
接口
如果一个抽象类中的所有方法都是抽象的,则可以将这个类用另外一种方式来定义,即接口。
在定义接口时,需要使用interface关键字来声明,具体示例如下:
(接口中所有方法都是抽象的)
异常
为了更好的展示异常信息,每个异常对象中都包含一些只读属性,这些属性可以描述异常的信息,通过这些属性可以更准确的找到异常出现的原因,具体如下表所示。
属性
类型
描述
Message
string
此属性含有解释异常原因的消息
StackTrace
string
此属性含有描述异常发生在位置信息
InnerException
Exception
如果当前异常是由另一个异常引起的,此属性包含前一个异常的引用
HelpLink
string
此属性为异常原因信息提供URN或者URL
Source
string
此属性含有异常起源所在的程序集的名称
C#程序中提供了一种对异常进行处理的方式——异常捕获。
异常捕获通常使用try…catch语句,具体语法格式如下:
try代码块用于处理可能发生的异常语句,catch代码块中是针对异常进行处理的语句。
当try代码块中的语句发生了异常,就会交给catch块进行匹配处理。
在C#中catch代码块有三种形式,分别用于处理不同级别的异常,具体形式如下:
1、一般的catch代码块:
catch后面没有任何内容,可以匹配try代码块中任意类型的异常,具体语法格式如下:
2、特定catch代码块:
catch后带有异常类型,他可以匹配该类型的所有异常,具体语法格式如下:
3、带对象的catch代码块:
catch后不仅带有异常类型,还带有异常对象,通过异常对象可以获取异常信息,具体语法格式如下:
在程序中可以使用多个catch块对异常进行捕获,但只有一个catch块可以捕获到异常,并对异常进行处理,因为当程序发生异常时,系统会按照catch代码块的先后顺序对异常进行捕获。
因此,这就需要将带有异常对象的catch块放在第一位,让其获取最准确的异常信息,然后将带有异常类型的catch块放在第二位,将一般的catch块放在最后,用于处理前面catch代码块都不能捕获的异常。
在程序中,有时希望有些语句无论程序是否发生异常都要执行,这时就可以在try….Catch语句后面加一个finally代码块。
注意:
在程序中使用异常语句时,try代码块是必须有的,而catch代码块和finally代码块必须要有一个,否则会出现编译错误。
throw关键字
当程序中出现异常时,不仅可以通过try…catch代码块捕获异常,还可以使用throw关键字抛出异常对象。
该异常对象可以被上层的try…catch代码块捕获处理,也可以不作处理。
throw关键字经常被用于将异常抛给上层代码处理,如果一直没有被处理,最后就会被操作系统捕捉到,而try…catch…会将程序抛出的异常直接进行处理。
在实际开发中,可以讲throw和try…cath…配合使用
定义命名空间的示例代码如下:
namespace是表示命名空间的关键字,Example表示命名空间名
程序集文件可分为四个部分,分别是程序集清单、元数据、CIL、资源集,具体说明如下:
●程序集清单:
包含描述该程序集中各元素彼此如何关联的数据集合,还包含指定该程序集的版本信息、安全标识所需的元数据、定义该程序集的范围以及解析对资源和类应用所需的元数据。
●元数据:
提供有关程序集中定义的类型信息,包括类型的名称、基类和类型所实现的接口等。
●CIL:
程序类型中所有的中间代码。
●资源集:
诸如位图、指针、静态文本等。
WinForm基础
WinForm项目的文件结构包括五个部分:
分别是Properties、引用、App.config、Form1.cs、Program.cs
●Properties用来设置项目的属性。
●引用用来设置对其他项目命名空间的引用。
●App.config用来设置数据库的配置信息。
●Form1.cs文件用来设置窗体界面以及编写逻辑代码。
●Program.cs文件用来设置项目运行时的主窗体。
其中Form1.cs和Program.cs文件专门用于完成窗体界面的设计及运行。
1、Form1.cs文件
Form1.cs文件本身由Form1.cs[设计]界面及Form1.cs逻辑代码两部分构成,具体如下:
Form1.cs[设计]界面位于Form1.cs文件下,双击解决方案窗口中的Form1.cs文件,切换到一个Form1.cs[设计]界面
Form1.cs逻辑代码,WinForm窗体程序除了向用户展示友好的界面外,还可以及用户界面进行交互,而实现交互功能的逻辑代码放在Form1.cs文件中。
在Form1窗体空白处右击会弹出快捷菜单,单击“查看代码”选项,就会进入Form1.cs界面
Form1.Designer.cs文件,用于在窗体类中自动生成控件的初始化代码,例如,将Button按钮拖到Form1.cs窗体上,会在Form1.Designer.cs文件自动生成一段代码。
Form1.resx文件,用于资源导入,窗体在加载或运行时,可以通过Form1.resx把资源导入到项目中,无需引用外部文件。
2、Program.cs文件(主程序)
每一种可执行程序都有自己的主入口,例如,控制台模板中的Main()方法就是程序的入口。
默认情况下,Program.cs文件是WinForm程序的主入口。
在C#中,所有控件都直接或间接继承自Control类,常用属性如下表所示。
这些属性都是控件的共同特征。
属性
说明
Name
指示代码中用来标识该对象的名称
Text
及控件关联的文本
Visible
确定该控件是可见的还是隐藏的
BackColor
控件的背景颜色
Cursor
指针移过该控件时显示的光标
Dock
定义要绑定到容器的控件边框
Enabled
指示是否启用该控件
Font
用于显示控件中文本的字体
ForeColor
此控件的前景色,用于显示文本
Size
控件的大小(以像素为单位)
Tag
及对象关联的用户定义数据
TextAlign
将在控件上显示的文本的对齐方式
在Control类中,除了定义属性,还定义了事件。
根据用户的操作引发相应的事件,开发人员可以根据不同的事件来编写具体的处理方法,下表中列举了Control类中常用的事件,其中Load事件在窗体加载时会被引发,Click事件会在控件被点击的时候被触发。
如图:
事件
说明
Load
窗体加载时被触发
Click
单击控件时发生
MouseEnter
在鼠标进入控件的可见部分时发生
MouseLeave
在鼠标离开控件的可见部分时发生
BackColorChanged
在控件的BackColor属性值更改时引发的事件
FontChanged
在控件的Font属性值更改时引发的事件
CheckBox复选框
用于多项选择,它只有选中和未选中两种状态,当被选中时,其Checked属性的值为true,否则为false。
一个窗体可以包含多个CheckBox控件,并且这些控件可以被同时选中。
RadioButton单选按钮
RadioButton单选按钮用于单选,它及CheckBox复选框类似,包括选中和未选中两种状态,当被选中时,其Checked的值为true,否则为false。
不同的是,若一个窗体中的多个RadioButton控件位于同一组,只能有一个RadioButton控件被选中。
ListBox列表框
用于显示选项列表,该列表中的数据是通过程序添加的,用户无法向列表输入数据,在ListBox列表框中,选项列表是通过Items属性表示的,该属性提供了一个Add()方法,用于向ListBox列表框中添加数据。
需要注意的是,ListBox列表框的选项可以被同时选中多个。
ComboBox下拉列表框
及ListBox列表框相比,ComboBox下拉列表框也是用来显示列表的,不同的是,该列表框中的选项只能被选中一个。
在ComboBox下拉列表框,提供了两个属性,分别是SelectedIndex和Items,其中,SelectedIndex属性用于获取或设置指定当前选中项的索引,Items属性用于表示选项列表。
GroupBox容器
GroupBox容器既能对控件进行分组,又能在一组控件周围显示一个带有可选标题的边框。
TreeView控件
TreeView控件以树形结构的方式来显示数据。
其目录的每个节点都有一个及之相关的TreeNode对象,每个TreeNode对象都包含一个Nodes和Level属性。
其中Nodes属性用于表示TreeNode对象的集合,Level属性用于获取TreeNode对象在TreeView控件中的深度。
(深度是从0开始的)
Timer控件
Timer控件可以周期性的执行某个操作,这些操作都是通过引发Timer控件的Tick事件完成的,Tick事件触发的频率是由Interval属性控制的。
ProgressBar控件
ProgressBar控件用来表示进度,该控件中的Value属性用来表示进度条的当前位置,Minimum表示进度条的范围下限,Maximum表示进度条的范围上限。