c学习笔记c重点整理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#学习笔记
1.C#具有所有面向对象的语言的所有特性:封装,继承,多态。
在C#系统中,
所有的类型都可以看作一个对象。
C#只允许单继承,即一个类不会有多个基类,C#不会有全局函数,不会有全局变量,不会有全局常数,所有的一切只能封装在一个类中。
包括四个部分:vos类型系统;元数据;公用语言规范;虚拟执行系统。
ing system表示导入名称空间。
4.让我们从第一个程序开始就记得:每个东西都必须属于一个类,类里面的方
法总是为我们完成某件工作的。
在C#中,程序的执行总是从main()方法开始的,一个程序中不允许出现两个或两个以上的main()方法。
对于习惯学C控制台程序的读者,必须要牢记:main()方法必须包含在一个类中。
5.利用string可以方便地对字符串进行连接或剪切。
例:string
s=”good”+”morning”;char x=s[3]字符串可以通过下标进行索引,得到一个字符。
6.我们可以用//进行单行标注,/* */进行多行标注。
7.在C和C++中,任何非0值都表示真,在C#中,任何非0值都不能代替true.
在其它类型的整型值和布尔值之间不存在任何的转换,将整型转换成布尔型是不合法的。
8.把一系列相关的变量组织成单一实体的过程称为生成结构的过程。
这个单一
实体的类型叫结构类型,每一个变量就是结构的成员。
9.结构类型包含的成员类型可以相同,也可以不同。
我们甚至可以把一个结构
类型当作另一个结构成员的类型。
10.枚举实际上是为一组在逻辑上密不可分的整数值提供便于记忆的符号。
结构
类型变量的值由各个成员的值组合而成。
而枚举则不同,枚举类型的变量在某一时刻只能取枚举中某个元素的值。
按照系统的设定,每个元素的类型都为整型。
且第一个元素的值为0,后面的每个元素梯加1,也可以直接赋值。
如把前面第一个元素的值设为1,后面的元素不用设,系统自动将后面元素的值递加1.
11.C#中另一大数据类型是引有类型。
其含义是该类型的变量不直接存储所包含
的值,而是指向它所要存储的值。
也就是说引用类型存储实际数据引用值的地址。
12.类是面向对象编程的基本单位,是一种包含数据成员,函数成员和嵌套类型
的数据结构。
类和结构都包含了自己的成员,但它们的区别是:类是引用类型,而结构是值类型。
13.如果我们对某个类定义了一个变量,则我们就将它称为类的一个实例。
14.我们常用到的类:object类。
这个类是其它所有类的基类,其它类型可以直
接或间接地从object类中继承。
因此,对一个object类的变量可以赋于任何类型的值。
15.代表?在声明代表时,只需要指定代表指向的原型的类型,它不能有返回值,
也不能带有输出类型的参数。
如:delegate int Mydelegate().在使用的时候:Mydelegate d=new Mydelegate(p.instanceMethod).为什么不用delegate d= new Mydelegate(p.instanceMethod)呢?原因是delegate相当于class需要一个名字,class myclass{…}这个class的名字是myclass
而且它包含有其它元素、常数或者函数,变量等。
跟char a=a不同,它不包含有其它的元素,a就是一个变量。
而myclass不是变量,它只一个名字。
而myclass a=new myclass(); a才是变量,是类的一个实例。
在这里,这个delegate的名字是Mydelegate,也并不是一个变量。
16.变量从用户角度来说,是存储信息的基本单元,从系统角度来说,变量就是
计算机内存中的一个储存空间。
17.静态方法不能用类的实例来访问,必须用类名来访问。
18.数组的声明:数组的类型 [数组的元素个数] 数组的名字;数组个数可以通
过数组名加圆点加Length获得。
如arr.Length表示arr数组的个数
19.在进行批量处理数据的时候,我们要用到数组.数组是一组类型相同的有序
数据.
20.数组的初始化:int[] a1=new int[]{1,2,3};为什么是new int[],而不是new
a1呢:因为int[]是类型,a1是int[]类型的一个实例.而且a1所代表的是{1,2,3},并不是函数.与delegate int Myclass();不同,Myclass()虽然是一个名字,但它可以代表一个函数,不是常数.原则:类型后面的名字如果可以代表函数,则这个名字就是一种类型.如果类型后面的名字代表常数,则这个名字不是一种类型,只是类型的一个变量.或者可以用另一种说法:如果名字后面含有(),{},[]则在赋值或设定实例的时候new后面要用该名字作为类型.
21.变量名不能与C#中的关键字名称相同;变量名不能与C#中库函数名称相同。
22.静态变量:static int a;一旦静态变量所属的类被加载,直到包含该类的
程序运行结束前它将一直存在。
23.稳性数据转换实际上就是从低精度的数据转换成高精度的的数据类型。
如:
ushort转换成int.
24.隐式枚举转换允许把十进制数0转换成任何枚举类型,对其它整数则不存在
这种隐式转换。
25.从元素类型为TS的数组类型S到元素类型为Tt的数组类型T转换,如果元
素类型为值类型,则不能进行隐式转换。
26.有一个元素类型为int的枚举类型E,则当执行从E到byte的显示枚举类型
转换时,实际上作的是从int 到byte的显示数字转换;当执行从byte到E 的显式枚举转换时,实际上是执行byte到int的隐式数字转换。
如:Weekday day;day=(Weekday) 3;实际上是E到byte的显示枚举类型转换。
27.如何使用枚举:
enum Color
{
red=0, yellow, blue,green,purple
};
Color color_arr = new Color();
Color_arr=(Color) 2;
Console.WriteLine(“Color_arr{0}”,Color_arr);
..
则其输出结果为blue.
28.赋值操作符(=)和条件操作符(?:)按照右结合的原则,即操作从右到
左的顺序执行。
Y=(x>10? 0:1).
29.枚举类型的加法:Weekday day1=Weekday.Sunday; Weekday
day2=Weekday.Saturday;Weekday day3=day1+6;枚举型加法实际上枚举基类型元素相加即一般为(int 型相加)。
30.如果两个整数类型的变量相除又不能整除,返回结果是不大于相除之值的最
大整数。
31.求余运算:5%3=2;5%1.5=0.5.
32.as操作符用于通过引用转换或装箱转换将一个值显式地转换成指定的引用
类型。
33.位运算符就是对数按二进制位进行运算的操作符。
位运算中的异或运算,当
两个位相同时,异或运算结果为0,不相同时异或运算为1.移位运算,左称位将操作数向左位移,高位被抛弃,低位顺序补0.右移运算时,如果X为非负数,最高位设为0;如果X为负数,最高位设为1,即最大为-1.
34.自增自减操作符:自增自减操作符有前缀和后缀之分。
对于前缀操作符,遵
行的原则是“先增减,后使用”,后缀则相反,“先使用,后增减”。
35.new操作符:new操作符用于创建一个新的类型实例。
它有三种形式:1,对象
创建表达式。
2,数组创建表达式。
3代表创建表达式。
36.typeof操作符用于获得系统原型对象的类型。
37.check 和 uncheck操作符只影响其置于括号中的运算的溢出检查。
二流程控制
1.C#提供的选择语句有if和switch语句。
2.如果if或else语句包含的嵌套语句只包含一条执行语句,则嵌套部分的大括号可以省略。
3.每一条else与离它最近且没有其它 else与之配对的if相搭配。
4.if语句仅允许布尔数据类型的结果。
例:if(args.length=0)是正确的。
而if(args.length)是不正确的。
args.length返回一个整形数(integer)。
5.switch语句是只能有一个default标签。
6.C#中它要求每个case标签项后使用break语句或中转语句goto,即不允许从一
个case自动遍历到其它case.如果想遍历其它语句,则可以加入下面两条跳转语句:goto case lable:跳至标签语句执行。
Goto default:跳至default标签执行。
7.数组的初始化:int[] a1=new int][]{1,2,3,4,5}
8.在事先知道循环次数的条件下,用for循环是比较方便的。
9.while语句中允许使用break语句来结束循环。
也可以使用continue语句来停止内嵌语句的执行,继续进行while循环。
10.可以使用break和continue语句来控制循环的表达。
如:要求打印除7以外的0到9的语句,只需要在到打印7的时候,跳出打印语句就可以了。
For(int i=0;i<9;i++){ if i==7 continue;console.write(i);}
11.foreach(Myint x in Prime){
12.预编译和条件编译都是以#开头的。
可以帮助我们在程序执行过程中发出编译的错误或警告。
13.溢出的处理用checked来检测。
14.预处理指令如果出现在其它输入输出元素中间就不会被执行。
中writeLine 或Readline等中间。
三类
1.C#中的类只支持单继承。
2.对类成员的访问:1.公有成员。
Public,允许外部访问。
2.私有成员。
Private,只允许类中的成员访问。
派生类都不能访问。
3.保护成员。
Protected.方便派生类的直接访问,同时又希望对外部是隐藏的。
4.内部成员。
Internal.对于同一包内的程序或库是透明的。
而对于包外是隐藏的。
5.类中的成员要么是静态要么是非静态。
一般来说,静态成员是属于类所有,非静态成员则属于类的实例-对象。
访问的时候:静态:类名.成员名;非静态:实例名.成员名(this.成员名)static
6.关键字const用于声明常量,后跟数据类型的声明。
例:public const double x=1.0;
7.构造函数不声明返回类型,构造函数用于执行类的实例的初始化。
8.折构函数在类的实例超出实用范围时,我们希望收回它所占的存储时使用。
析构函数跟类名相同,只是在前面加上一个符号:~
9.值参数:使用值参数时,初调用的方法不会修改内存中实参的值。
引用型参数:引用型参数并不开辟新的内存区域。
当利用引用型参数向方法传递形参时,编译程序将把实际参数所在内存中的地址传递给方法。
10.substring(0,i)从此实例检索子字符串。
子字符串从指定的字符位置开始且具有指定的长度。
String.indexof(char) 报告指定Unicode 字符在此字符串中的第一个匹配项的索引.
11.输出型参数: 输出型参数也不开辟新内存,跟引用型参数一样,只是引用型参数在使用的时候不用需要对变量进行初始化,引用型参数用于传递方法的返回数据。
12.如果形参中包含了数组参数,那么它必须在参数表中位于最后。
另外,参数只允许一维数组。
13.静态方法可以访问类中的静态成员,但不能访问非静态成员。
但可以将类的实例当作参数传递给方法使用,指明具体的调用对象,这时就可以操作实例的静态和非静态成员了。
14.类的方法的重载:方法的名字相同,但参数个数或类型不同,编译器就能知道在什么时候调用什么方法。
15.C# 中,操作符重载总是在类中声明,并且通过调用类的成员方法来实现。
操作符重载可以适用于类的实例的操作。
16.静态域的声明用static修饰符。
无论建立多少个该类的实例,内存中只存在一个静态数据拷贝。
域相当于简单成员变量。
在另一个类对静态域的访问可以通过对静态域所在类的public方法进行访问。
17.简单地说:const型表达式的值在编译时形成,而只读域static readonly表达式的值在程序运行时才形成。
这种方法有利于版本的控制。
18.对于静态域,类在装载时对其进行初始化;对于非静态域,在类的实例创建时进行初始化。
19.虽然域和属性语法类似,但不能把属性当作变量那样使用。
也不能把属性当作引用型参数或输出型参数进行传递。
在属性的访问声明中,对属性的值的访问用get关键字标出。
对属性的值的写操作用set标出。
20.不直接操作类的数据内容,而是通过访问器进行访问,它借助get和set对属性值进行读写。
事件和索引指示器
1.事件所声明的类型必须是一个代表类型(delegate),代表类型应预先声明。
2.在编写类的时候,我们可以编写事件向客户说明发生了什么事情。
事件可以
在类的属性或域中加以说明,但事件的类型必须是代表型的。
我们可以预订事件确保事件初触发或撤消触发。
3.索引指示器为我们象使用数组那样为类或类的实例添加路径列表,通过下标
进行访问类中的信息。
4.事件的声明格式:例:public event eventhandler click;这个省略了事件
访问声明。
5.public event eventhandler click{。
}这个没有省略事件访问声明。
大
多数情况下不用事件访问声明。
6.索引指示器:IPaddress[] m_arrayips;public void IPaddress this[int
nindex]{ get{return m_arrayips[int nindex]}}; this代表实例,我们象使用数组那样为类或类的实例添加路径列表. 实例[i]实际上代表的是类中的属性或域的信息列表。
实例[i].
继承
1.C#中,一个派生类只能从一个类中继承。
Object类为所有类的基类。
2.虚方法:当类中的方法声明前加了virtual,我们称为虚方法,它在执行时可
以被派生类改变。
派生类中Override+虚方法。
虚方法在基类中定义,则基类运行虚方法时会实际运行派生类中的方法。
还必须指明,基类实例=派生类实例。
3.抽象类:abstract.抽象类只能作为其它类的基类,不能直接实例化。
如果一
个非抽象类从抽象类中派生,则其必须通过重载来实现所有继承而来的抽象成员。
抽象类是特殊的虚类。
4.在派生类中重新定义虚方法,要求方法名称,参数个数和类型必须与基类虚
方法完全一致。
5.只能在抽象类中声明抽象方法。
抽象类可以作为非抽象类的基类,也可以作
为派生类。
我们可以利用抽象方法来重载基类虚方法,这时基类中的虚方法
就被拦截了。
6.密封类不能继承,密封类不能同时又是抽象类,抽象类总是希望被继承。
密
封类不可能有派生类,如果密封类中有虚成员函数,则该成员可以转化成非虚的,virtual无效。
7.密封方法可以防止方法的重载。
不是所有成员方法都可以作为密封方法,密
封方法必须对基类的虚方法进行重载,提供具体的实现方法。
所以,在方法的声明中,sealed修饰符总是和override修符同时使用。
8.抽象属性,抽象方法只允许在抽象类中声明。
抽象类的这些成员交给派生类
去实现。
必须在非抽象类中重载抽象属性,非抽象类不允许存在抽象成员。
属性声明时如果有sealed,则必须同时有override.修饰符。
9.抽象方法在派生类中不能用base关键字会访问。
接口
1.每个组件都是独立的,有其独特的功能,只能通过接口与外界通讯,当一个
组件需要提供新的服务时,可以通过新的接口来实现。
2.组件应该具有与编程语言无关的特性。
组件模型是一种规范,不管采用哪种
语言设计组件,都必须遵守这一规范。
3.在接口的声明体中,可以定义接口的成员,接口的成员可以是方法,属性,
索引指示器和事件。
4.接口继承和类继承不同,接口继承只是说明继承。
C#中类继承只能是单继承,
但接口可以是多继承。
被继承的接口应该是访问得到的,不能从private或internal类型的接口中继承。
5.对一个接口的继承也就继承了这个接口的所有成员。
6.接口成员不能是常量,域,操作符,构造函数或析构函数,而且不能包括所
有的静态成员。
7.接口成员默认的访问方式是public,接口成员声明不能包含任何修饰符。
与
不能加abstract,public,protected….
8.如果底层成员的命名与高级成员的命名一样,那么底层成员将覆盖同名高级
成员。
但由于接口的多继承性,如果两个父成员具有两个相同名的成员,这就产生了两义性,这时需要显示声明,明确指出需要调用哪个父接口成员。
9.我们只需要记住一点:一旦成员被覆盖以后,所有对其的访问都被覆盖后的
成员“拦截”。
10.接口定义不包括方法的实现部分,接口可以通过类和结构来实现。
用类来
实现接口的时候,接口名称必须包含在类声明的基类列表中。
如:class A:isequence,itest,如果类实现了接口,那么类也隐式地继承了该接口的所有父接口,不管这些父接口有没有在类的声明的基类列表中出现。
11.一个类可以实现多个接口。
如果类中每个成员都明显地指出了被实现的接
口,通过这种途径被实现的接口我们称之为显式接口成员。
显式接口成员只能通过接口调用,而不能通过类调用。
12.不能在方法调用,属性访问,以及索引指示器访问中通过全权名访问显式接
口成员执行体。
事实上,显式接口成员执行体只通过接口的实例,仅仅引用接口的成员名称来访问。
13.显式接口成员执行体的接口必须显式地出现在类的基类列表中,即使类隐式
的实现了接口。
14.接口的成员包括它自己声明的成员,而且包括该接口所有父接口声明的成
员。
在接口的映射上,不仅要对接口声明中显式声明的所有成员进行映射,而且要对隐式地从父接口中继承而来的接口成员进行映射。
包括与父接口中相同名称的成员。
15.类必须为所有基类表中列出的所有接口成员提供具体的实现。
16.类中使用Private,protected和static修饰符的成员不能参与实现接口的映
射。
17.如果子接口成员要覆盖父接口的成员,成员的名字必须相同,而且子接口成
员名称前用new.
18.一个类继承了它的基类提供的所有接口的实现。
如果不显式的重新实现接
口,派生类就无法改变从基类中继承来的接口映射。
19.显式说明的接口成员不能被声明为虚的。
但可以通过显式接口实现调用另一
个方法,这个被调用的方法可以声明为虚的。
允许被派生类重载。
20.继承了接口实现的类可以对接口进行重实现,这个接口要求是在类声明的基
类列表中出现过的。
21.抽象类允许将接口的方法映射到抽象的成员方法。
显式说明的接口成员不能
是抽象的,但它允许调用抽象的方法。
组织应用程序
1.使用普通的函数库,在程序链接时将库中的代码拷贝到可执行文件中,这叫
静态链接。
2.动态链接库不一样,只有程序在使用时才将其拷贝,并且只有一份拷贝。
动
态链接库是一种程序模块,它不仅包括可执行代码,而且通常还包括了各种类型的预定义数据和资源。
3.装配有两种类型:应用程序和库。
应用程序都有一个入口,能常扩展名
为:.exe。
库的扩展名:.dll.
4.名字空间的声明要么在编译单元(源文件)第一行,要么作为成员也现在别
的名字空间中。
5.名字空间的成员可以是类,结构,枚举,或代表等。
也可以是另一个名字空
间。
6.别名指示符为我们提供了一个标识符,在整个编译单元,或是在名字空间主
体之中,这个标注符作为名字空间或类型的别名。
7.别名指示符不能与同一编译单元或名字空间中的其它成员重名。
别名只在包
含它名字空间的主体内有效,但把别名放到名字空间外部,编译单元内,则别名对于编译单元内的所有名字空间是有效的。
8.如果名字空间使用指示符使用了名字空间,但没有指出使用其嵌套的名字空
间,则只能可以使用直接使用该名字空间中的成员,而不能直接使用其嵌套成员。
9.可以using 类型、名字空间。
10.注意别名指示符不能与同一编译单元或名字空间的中的其它它成员同名。
文件操作
1.system.IO提供的类:支持输入输出的类型:
stream,fileinfo,Directory,BinaryReader,BinaryWriter.。
2.文件是存储在永久介质中的数据的有序集合。
流也是一种对数据读写操作的
基本对象,但它除了文件流外,还有其它多种类型,可以分布在网络中,内存和磁带中。
3.Directory类进行目录管理。
File类进行文件管理。
4.读写文件:按文本模式读写:streamreader,streamwriter.按二进制读写文
本流:BinaryReader,BinaryWriter.
5.:FileMode.open or create FileStream fileStream = new
FileStream(fileName, FileMode.Create)
6.
BinaryWriter binWriter = new
BinaryWriter(File.Open(fileName, FileMode.Create)); binWriter.Write(showStatusBar);将字符串的内容showStatusBar 以二进制方式写入流stream。
并根据所使用的编码和写入流的特定字符,提升流的当前位置(流的长度)。