看到一篇写的很好技术文档  我就转过来了 先谢谢作者了

C# 语法学习笔记


1 A.类:
2 ● 类与类的使用:
3 class A{
4 public int wheels; \\公有成员
5 protected float weight; \\保护成员
6 }
7 class B{
8 void F{
9 A v1=new A(); \\创选类A的实例
10 v1.wheels=10; \\调用类A的公有成员成功
11 v1.weight=1.0; \\错,因为此变量为保护成员
12 }
13 } 
14 ● 类的继承:
15 类B从类A中继承
16 class A{}
17 class B:A{}
18 
19 
20 B.静态成员和非静态成员:
21 一般说来,静态成员属于类所有的,非静态成员则属于类的实例--对象
22 (非静态成员在类的每个实例中都占有一个存储(或者说具有一个副本),
23 而静态方法是类所共享的,无法判断当前的非静态属于哪个类的实例.
24 引用静态与非静态成员:
25 int a; //非静态成员
26 static int b; //静态成员
27 void F(){ //非静态方法F
28 a=1; //正确,等价于this.x=1
29 b=1; //正确,等价于Test.y=1
30 }
31 static void G(){
32 a=1; //错误,不能访问this.x
33 b=1; //正确,等价于Test.y=1
34 }
35 static void Main(){
36 Test t=new Test();
37 t.a=1; //正确
38 t.b=1; //错误,不能在类的实例中访问静态成员
39 Test.a=1; //错误,不能在类问非静态成员
40 Test.y=1; //正确
41 }
42 ● 在同一类的引用
43 非 访 非=直接(可用this.X) 静 访 静=直
44 非 访 静= Test.a 静访非=创造实例=t.a
45 Test t= newTest();创造实例后用qf.F()访问< /FONT>< /FONT> 
46 
47 C.this 保留字在各种结构中的含义: 实例=类的结构
48     1.(类的构造函数)值类型,对构造的对象本身的引用
49     2.(类的方法)值类型,对调用该方法的对象的引用
50 3.(结构的构造函数)变量类型,对构造的结构的引用
51 4.(结构的方法)变量类型,对方法的结构的引用 
52 
53 D.构造函数析构函数 (作用用于执行类的实例的初始化)
54 ● 通常与类名相同
55 ● 不声明反回类型
56 ● 一般是public类型,如是private表明类不能被实例化,这通常用于只含有静态成员的类
57 ● 不要做对类的实例进行初始化以外的事情,也不要尝试显式地调用构造函数
58 intx=0,y=0,count; //不带参数的
59 public A(){
60 count=0;
61 }
62 public A(int vx.int vy){ //带参数的
63 x=vx;
64 y=vy;
65 } 
66 
67 E.方法
68 ● 不能与类中的成员名相同
69 ● 用abstract和extern修饰方法的执行有一个简单的分号
70 ● 执行部份通过return语句得到返回值,return后不跟任何值,反回的是void型
71 ● (非静态成员在类的每个实例中都占有一个存储(或者说具有一个副本),
72 而静态方法是类所共享的,无法判断当前的非静态属于哪个类的实例. 
73 ● 值参数,给值做一份拷贝
74 ● 引用型参数ref
75 ● 输出参数out
76 ● 数组型参数params(否则提示重载) 
77 
78  
79 
80 static int max(intx,int y){
81 if(x>y)
82 return x; 
83 else
84 return y;
85 }
86 static void Main(){
87 Console.WriteLine("10与8那个大:{0}",max(10,8));
88 }
89 
90 
91 F.属性
92 ● 在C#中不直接操作类的数据内容,而是通过访问器进行访问.借助于get和set对属性的值进行读写
93 ● 只有set,只能设置不能读出
94 ● 只有get,只读不能改写
95 ● 同时具有set和get,读写都是允许的.
96 ● 除使用abstract修饰抽象属性,每个访问器的执行体中只有分号";",其它所有属性的get访问器都昌通
97 过return来读取属性的值,set访问器都通过value来设置属性的值.
98 
99 public class File
100 {
101 private string s_filename;
102 public string Filename{
103 get{ \\读
104 return s_filename;
105 }
106 set{ \\写 
107 if(s_filename!=value){
108 s_filename=value; \\过通value设置属性
109 }
110 }
111 }
112 }
113 public class Test
114 {
115 public static void Main(){
116 File f=new File();
117 f.Filename="myfile.txt";
118 string s=f.Filename;
119 }
120 }
121 
122 
123 G.接口(interface)默认为public修饰
124 下面的例子定义了一个名为IControl的接口,接口中包含一个成员方法Paint
125 接口ITextBox和IListBox都从接口IControl中继承,承者也就继承了接口IControl的Paint方法:
126 using System;
127 interface IControl { void Paint(); }
128 interface ITextBox:IControl { void SetText(string text); }
129 interface IListBox:IControl { void SetItems(string[]items); }
130 interface IComboBox:ITextBox,IListBox{}
131 
132 
133 ★ 第十七章 文件操作
134 A.入输出操作的类型
135 1.支持字节的读写操作 System.IO.Stream 包括
136 ● 读操作Reading 
137 ● 写操作Writing
138 ● 搜索操作Seeking,有些流不支持以上的所有操作,如网络流就不支持搜索操作
139 2.BinaryReader和BinaryWriter支持从字符串或原始数据到各种流之间的读写操作
140 3.File和Directory类的基类都是抽象类FileSystemEntry
141 ● File对文件的基本操作,包括创建\拷贝\移动\删除和打开一个文件
142 ● Directory类执行常见的各种目录操作,如创建\移动\游戏目录及其子目录
143 ● 
144 ● 
145 
146  
147 
148  
149 
150 类的方法默认为受保护修饰
151 
152  
153 
154  
155 
156 Main()函数的参数只有两种参数形式:无参数和string 数组表示的命令行参数,即static void Main()或static void Main(string[]args) ,后者接受命令行参数。一个C#程序中只能有一个Main()函数入口点。其他形式的参数不具有入口点语义,C#不推荐通过其他参数形式重载Main()函数,这会引起编译警告.
157 Main()函数返回值只能为void(无类型)或int(整数类型)。其他形式的返回值不具有入口点语义。
158 
159  
160 
161 a=new 代理1(类1.方法1) //把类的一个方法赋给a
162 a(); //输出 类1 中一个方法的值
163 ------------类修饰符-------------
164 public //公有成员,不限制对该类的访问
165 protected //保护成员,只能从所在类和所在类派生的子类进行访问
166 internal //内部成员,只有其所在类才能访问
167 private //私有成员,只有对包.Net中的应用程序或库才能访问
168 abstract //抽象类,不允许建立类的实例
169 sealed //密封类,不允许被继承
170 -------------方法修饰符----------
171 new
172 public
173 protected
174 internal
175 private
176 static
177 virtual //虚方法
178 sealed
179 override //派生类中声明虚方法
180 abstract
181 extern
182 ---------------------------------
183 
184 
185 一、数据类型
186 
187 1.整数类型
188 短字节型(sbyte)、字节型(byte)、短整型(short)、无符号短整型(ushort)、
189 整型(int)、无符号整型(uint)、长整型(long)、 
190 
191 2.布尔类型
192 '真'或'假' 用true和false表示 
193 
194 3.实数类型
195 浮点类型: 单精度(float)和双精度(double)
196 十进制类型(decimal) //定义十进制变量并赋值时,用m下标表明它是十进制类型.如省略了m下标,
197 //在被赋值前,它将被编译器当作双精度处理。如:decimal d_value=1.0m;
198 4.字符类型
199 char c='A'; //字符类型采用了国际gb2312字符集标准.一个gb2312的标准字符长度为16位.
200 
201 5.结构类型
202 struct //程序设计中经常要把一组相关的信息放在一起.一系列相关的变量组织成为单一实体的过程,
203 //称为生成结构的过程.这个单一实体的类型我们就叫做结构类型,每一个变量称为结构的成员。
204 //结构类型采用struct来声明.下面代码定义一个通讯录记录结构(包括姓名、电话和地址)的定义。
205    Struct PhoneBook{
206    public string name;
207    public string phone;
208    public string address;
209    }
210    PhoneBook p1;
211 //p1就是一个通讯录(PhoneBook)结构类型的变量.声明中的public表示对结构类型成员的访问权限
212 //访问结构成员可通过结构变量名加上访问符"."号,后跟成员的名称 赋值给成员如:p1.name= "tom";</FONT>< /FONT>
213 
214 6.枚举类型
215 枚举(enum)实际上是为一组在逻辑上密不可分的整数值提供便于记忆的符号。下面的程序代码声明了一个代表星期的枚举类型的变量。
216    Enum WeekDay{
217    Sunday,Monday,Tuesday,Wednesday,Friday,Saturday
218    };
219    WeekDay day;
220    注意:枚举类型的变量在某一时刻只能取枚举中某一个元素的值。如,day这个表示“星期”的枚举的变量,它的值要么是Sunday,要么是Monday或其他的星期元素,但它在一个时刻只能代表具体的某一天,不能既是星期二,又是星期三。
221    Day=Tuseday;
222    按照系统默认,枚举中的每个元素都是整型(int),且第一个元素删去的值为0,它后面的每一个连续的元素的值按加1递增。在枚举中,也可以给元素直接赋值。下面的程序代码把星期一的值设为1,其后的元素的值分别为2,3……
223    enum WeekDay{
224    Sunday=1,Monday,Tuesday,Wednesday,Friday,Saturday
225    };
226    为枚举类型的元素所赋值的值的类型限于long、int、short和byte等整数类型。
227 
228 
229 二、引用类型
230 引用的含义是该类型的变量不直接存储所包含的值,而是指向它所要存储的值。
231 即引用类型存储实际数据的引用值的地址。 C#中的引用类型有四种: 类 代表 数组 接口 
232 
233 1. 类是面向对象编程的基本单位,是一种包含数据成员、函数成员和嵌套类型的数据结构.类和结构最主要的区别在于:类是引用类型,而结构是值类型.类支持继承机制,通过继承,派生类可以扩展基类的数据成员和函数成员,进而达到代码重用和设计重用的目的。下面介绍两个经常用到的类:
234    object类:它是所有其他类型的基类,C#中的所有类型都直接或是间接地从object类中继承。因此,对一个object的变量可以赋予任何类型的值。
235    Int x=25;
236    object obj1;
237    obj1=x;
238    object obj2='A';
239    对object类型的变量声明采用object关键字,这个关键字是在.NET平台中为我们提供的预定义的名字空间System中定义的,是类System.Object的别名。 
240 
241 
242 String类:专门用于对字符串的操作。同样,这个类也是在.NET平台中为我们提供的预定义的名字空间System中定义的,是类System.String的别名。
243    字符串在实际中应用非常的广泛,在类的定义中封装了许多内部的操作,我们只要简单地加以利用就可以了。可以用加号“+”合并两个字符串,采用下标从字符串中获取字符等。
244    String String1="Welcome";
245    string String2="Welcome"+"everyone"; /// 连接字符
246    char c=String1[0]; /// 把变量String1的第一个字符赋给c
247   boolb=(String1==String2); /// 执行布而运算,两值相等赋值True ,不等赋值False
248 
249 
250 2.代表
251    在C#中取消了C和C++中的指针的这个概念。而代表实际上相当于是C#中的函数指针原型,与指针不同的是,代表在C#中是类型安全的.在声明代表时,只需要指定代表指向的原型的类型,它不能有返回值,也不能带有输出类型的参数。如我们可以声明一个指向int类型函数原型的代表:
252    delegate int MyDelegate();
253    如果我们声明了自己的一个代表,那么它就是对系统定义的类System.deldgate的一个扩展。
254 
255 
256 3.数组
257    在进行批量处理数据的时候,我们要用到数组。数组是一组类型相同的有序数据。数组按照数组、数据元素的类型和维数来进行描述。C#中提供Ststem.Array类是所有数组类型的基类。
258    数组的声明格式为:
259    non-array-type[dim-separators] array-instance name;
260    比如我们声明一个整数数组:
261    int[]arr;
262    在定义数组时,可以预先指定数组元素的个数,这时在“[]”中定义数组的元素个数,它的个数可以通过数组名加圆点加“Length”获得。而在使用数组时,可以在“[]”中加入下标来取得对应的数组元素。C#中的数组元素的下标是从0开始的,以后递增。
263    在C#中数组可以是一维的也可以是多维的,同样也支持矩阵和参差不齐的数组。其中一维数组最为普遍,用得也最多。
264    Class Tese
265    {
266    static void Main(){ //可动态生成数组的长度
267    string[] a1; //一维数组string
268    string[][] a2; //二维数组string
269    string[] []a3; //三维数组string
270    }
271    } 
272 
273 4.接口
274    接口定义了一个协议(conrtact)。一个类或结构要实现接口就必须坚持这种协议。接口可以包括方法、属性、索引和事件作为成员。下面的程序代码说明了一个接口,它包含一个索引、一个事件E、一个方法F和一个属性P。
275    Interface Iexampie
276    {
277    string this[int index]{get; set;}\
278    event EventHandler E;
279    void F(int value);
280    string P{get; set;}
281    }
282 
283 
284 三、变量与常量
285 Variable //使用变量的一条重要的原则是:变量必须先定义后使用
286 变量的类型
287    在C#中,我们把变量分为七种:静态变量、非静态变量、局部变量、数组元素、值参数、引用参数和输出参数等。
288    静态变量:带有“static”修饰符声明的变量称为静态变量。一旦静态变量所属的类被装载,该类程序结束后变量的值被采放。静态变量就是该变量类型的默认值。静态变量最好是在定义时便赋值。如static a =10;
289    非静态变量:不带有“static”修饰符声明的变量称其为实例变量。如int a;类中的非静态变量,一旦一个类的新的实例被创建,直到该实例不再被应用从而所在空间被释放为止,该非静态变量将一直存在。同样鉴于定义赋值检查,一个类的非静态变量也应该是在初始化的时候赋值。
290    数组元素:数组元素也是变量的一种,该变量随该数组实例的存在而存在。每一个数组元素的初始值是该数组元素类型的默认值。同样地,鉴于定义赋值检查,数组元素最好是在初始化的时候被赋值。
291    局部变量:局部变量是指在一个独立的程序块中,一个for语句、switch语句或者using语句中声明的变量,它只在该范围内有效。当程序运行到这个范围内时,该变量即开始生效,程序离开时变量失效。与其他几种变量类型不同的是,局部变量不会自动被初始化,所以也就是没有默认值。在进行赋值检查时,局部变量被认为没有被赋值。
292    在局部变量的有效范围内,在变量的定义以前就使用是不合法的。如下面的代码:
293    for(int I=0;I<10;I++){
294    int num=a; //这是非法的,因为局部变量a还没有被定义
295    int a;
296    int b=a;
297    }
298    有关值参数、引用参数和输出参数在这里我们不作讨论,有兴趣的读者可以参看相关的书藉。 
299 
300 常量声明的格式如下:
301    attributes constant-modifiers const type constant-declarators;
302    其中:常量修饰符constant-modifiers可以是:new、public、protected、internal、private。
303    常量的类型type必须是下面中的一种:
304    sbyle、byte、short、ushort、int、uint、ulong、char、float、double、decimal、bool、string或是引用类型(reference-type)。
305    常量表达式constant-declarators表示常量的名字。
306    如:public const double X=1.0,Y=2.0,Z=3.0;
307 
308 四、表达式
309 1.操作符的分类
310    表达式由操作数和操作符组成。表达式的操作符指出了对操作数的操作。比如操作符有+、—、/;操作数可以是文字、域、当前变量或表达式。
311 依照操作符作用的操作数的个数来分,C#中有一元操作符:作用于一个操作数,包括前缀操作符和后缀操作符;二元操作符:作用于两个操作数,使用时在操作数中插入操作符;三元操作符:只有一个操作符“?:”。作用于三个操作数,使用时在操作数中间插入操作符。
312    下面分别给出使用操作符的例子:
313   intx=5,y=10,z;
314    x++; //后缀一元操作符
315    --x; //前缀一元操作符
316    z=x+y; //二元操作符
317    y=(X>10?0:1); //三元操作符
318    2.操作符的优先级
319    当一个表达式包含多样操作符时,操作符的优先级控制着单个操作符求值的顺序。例如,表达式x+y*z按照x+(y*z)求值,因为“*”操作符比“+”操作符有更高的优先级。下表给出了所以操作符从高到底的优先级顺序。
320    (^60090201h^)< br>  当一个操作数出现在两个有相同优先级的操作符之间时,操作符按照出现的顺序由左至右执行。除了赋值的操作符,所有的二进制操作符都是按照从左向右的顺序执行。如x+y+z按(x+y)+z进行。<br>  赋值操作符和条件操作符(?:)按照从右向左的顺序执行。如x=y=z按照x=(y=z)进行。
321    建议:在写表达式时,如果无法确定操作符的有效顺序,则尽量采用括号来保证运算的顺序,这样也使得程序一目了然,而且自己在编程时能够思路清晰。
322 
323 
324 五、流程控制
325 1.条件语句
326 当程序中需要进行两个或两个以上的选择时,可以根据条件判断来选择将要执行的一组语句。C#提供的选择语句有if语句和switch语句。
327    (1)if语句
328    if语句是最常用的选择语句,它根据布尔表达式的值来判断是否执行后面的内嵌语句。其格式为:
329    if(boolean-expression)embedded-statement或
330    if(boolean-expression)embedded-statement
331    else embedded-statement
332    当布表达式的值为真时,则执行if后面的内嵌语句embedded-statement。为假时则程序继续执行。如果有else语句时,则执行else后面的内嵌语句,否则继续执行下一条语句。
333    If (x-int(x)>0.5
334    {
335    I=int(x)+1;
336    }
337    else
338    {
339    I=int(x)
340    }
341    如果if或者else之后的嵌套语句只包含一条执行语句,则嵌套部分的大括号可以省略。如果包含了两条以上的执行语句,对嵌套部分一定要加上大括号。
342    如果程序的逻辑判断关系比较复杂,通常会采用条件判断嵌套语句。If语句可以嵌套使用,即是在判断之中又有判断。具体的形式如下:
343    if(boolean-expression)
344    {
345    if(boolean-expression)
346    {……};
347    else
348    {……};
349    ……
350    }
351    else
352    {
353    if(boolean-expression)
354    {……};
355    else
356    {……}
357    ……
358    }
359    此时应注意,每一条else与离它最近且没有其他else与之对应的if相搭配。
360    (2)Switch语句
361    if语句每次判断只能实现两条分支,如果要实现多种选择的功能,那么可以采用Switch语句。Switch语句根据一个控制表达式的值选择一个内嵌语句分支来执行。它的一般格式为:
362    switch(controlling-expression)
363    {
364    case constant-expression;
365    embedded-statements
366    default;
367    embedded-statements
368    }
369    Switch语句的控制类型,即其中控制表达式(controlling-expression)的数据类型可以是sbyle、byte、short、short、uint、long、ulong、char、string或是枚举类型(rnum-type)。每个case标签中的常量表达式(constant-expression)必须属于或能隐式转换成控制类型。如果有两个或两个以上case标签中的常量表达式值相同,编译时将报错。Switch语句中最多只能有一个default标签。
370    下面的程序代码说明Swtich语句按所提供参数的数字执行不同的语句。
371    using system;
372    class Test
373    {
374    static void Main (string[] args) {
375    switch (args.Length) {
376    case 0;
377    Console.WriteLine ("No arguments were provided");
378    break;
379    case 1;
380    Console.WriteLine ("One arguments was provided");
381    break;
382    default;
383    Console.WriteLine ("{0} arguments were provided");
384    break;
385    }
386    }
387    }
388    2.循环语句
389    循环语句可以实现一个程序模块的重复执行,它对于我们简化程序,更好地组织算法有着重要的意义。C#提供了四种循环语句:While语句、do-while语句、for语句、foreach语句。
390    (1)While语句
391    While语句有条件地将内嵌语句执行0遍或若干遍。其格式为:
392    while (boolean-expression) embedded-statement
393    其执行的顺序是:
394    首先计算表达式boolean-expression的值;当布尔表达式的值为真时,执行语句embedded-statement一遍,程序转至第1步;当布尔表达式的值为假时,while循环结束。
395    (2)do-while语句
396    do-while语句与while语句不同的是,它将内嵌语句执行一次(至少一次)或若干次。其格式为:
397    do embedded-statement while(boolean-expression)
398    其执行的顺序是:
399    首先执行内嵌语句embedded-statement一遍;当布尔表达式的值为真时则回到第1步,为假时则终止do循环。
400    在do-while循环语句中同样允许用break语句和continue语句实现与while语句中相同的功能。
401    (3)for语句
402    for语句是C#中使用频率最高的循环语句。在事先知道循环次数的情况下,使用for语句是比较方便的。其格式为:
403    for(inttializer,condinton;iterator)embedded-statement
404    其中inttializer、condinton、iterator三项是可选项。Inttializer为循环控制变量做初始化,循环控制变量可以有一个或多个(用逗号隔开);condinton为循环控制条件,也可以有一个或多个语句;iterator按规律改变控制变量的值。
405    其执行的顺序是:
406    首先按照书写顺序将inttializer部分(如果有)执行一遍,为循环控制变量赋初值;然后测试condinton(如果有)中的条件是否满足;若没有condinton项或条件满足,则执行内嵌语句一遍,按iterator改变循环控制变量的值,回到第2步执行;若条件不满足,则for循环终止。
407    下面的程序代码说明用一个for语句写出整数1~10。
408    Using System;
409    class Test
410    {
411    static void Main(){
412    for (int I=0; I<10; I++)
413    Console.WriteLine(I);
414    }
415    }
416    (4)foreach语句
417    foreach语句是在C#中新引入的。它表示收集一个集合中的各元素,并针对各个元素执行内嵌语句。其格式为:
418    foreach(type identifier in expression)embedded-statement
419    其中类型(type)和标识符(identifier)用来声明循环变量,表达式(expression)对应集合。每执行一次内嵌语句,循环变量就依次取集合中的一个元素代入其中。在这里,循环变量只是一个只读型局部变量,如果试图改变它的值或将它作为一个ref或out类型的参数传递时,都将引发编译出错。
420    Foreach语句中的expression必须是集合类型,如果该集合的元素类型与循环变量类型不一样,则必须有一个显示定义的从集合中的元素类型到循环变量元素类型的显示转换。
421    下面的程序代码说明用一个foreach语句来循环显示列表中的元素。
422    Using System;
423    using System.Collections;
424    class Tese
425    {
426    static void WriteList(Arraylist list){
427    foreach(object o in list)
428    Console.WriteLine(o);
429    }
430    static void Main(){
431    ArrayList list=new ArrayList();
432    for(int I=0; I<10; I++)
433    list.Add(I);
434    WriteList(list);
435    }
436    }
437    3.转子语句
438    (1)break语句和continue语句
439    break语句用来退出最近的switch、while、do、for、foreach语句的循环,而continue语句用来开始一个新的while、do、for和foreach语句的循环。
440    (2)标签声明和goto声明
441    标签声明可以交替声明,goto声明可以把控制传送到标签声明。
442    (3)return语句
443    返回对语句中的成员控制。无表达式的return语句只能在无返回值的成员中应用。带表达式的return语句只能在返回表达式的函数成员中运用。
444    (4)throw语句与try语句
445    throw语句用来抛出异常。Try语句提供一个在程序块执行过程中捕获异常的机制。此外,try语句还提供当try语句脱离控制时总是要执行的代码块。
446    (五)异常处理
447    程序中对异常的处理能使你的程序更加强壮。现在的许多程序设计语言都增加了异常处理的能力,C#也不例外。
448    1.异常处理语句
449    C#中的异常处理语句有三种形式:try-catch 捕捉异常、try-finally 清除异常、try-catch-finally 处理所有异常。
450    下面的一段代码处理溢出异常:
451    try{
452    for(;n<=max;n++)
453    sum*=n;
454    }
455    catch(OverfolwException oe)
456    {
457    Console.WriteLine(“溢出“);
458    return;
459    }
460    2.清除异常
461    try-finally 结构将清除异常。看下面的代码:
462    try{
463    for(;n<=max;n++)
464    sum*=n;
465    }
466    finally
467    {
468    Console.WriteLine(“溢出“);
469    return;
470    }
471    上面的代码中finally 子句中的代码在任何情况下总会被执行,即使没有异常发生。
472    3.处理所有异常
473    try-catch-finally 处理所有的异常。如下面的代码:
474    try{
475    for(;n<=max;n++)
476    sum*=n;
477    }
478    catch(OverfolwException oe)
479    {
480    Console.WriteLine(“溢出“);
481    return;
482    }
483    catch(Exception e)
484    {
485    //捕捉所有异常
486    }
487    finally
488    {
489    }
490    4.抛出异常
491    程序中我们可以先抛出异常,然后进行捕捉。
492    抛出异常的语法如下:
493    throw new Exception()