2023年C基础知识点.pdf
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、命名空间5.3、M a i n 方法6,程序例子7、作业数据类型1.1 值类型、引用类型C#的数据类型可以提成两大部分:值类型和引用类型。值类型的变量总是直接包含着自身的数据,而引用类型的变量是指向实际数据的地址。C#值类型涉及:整型、布尔型、实型、十进制型、结构和枚举、接口和数组。从概念上看,其区别是值类型直接存储其值,而引用类型存储对值的引用。这两种类型存储在内存的不同地方:值类型存储在堆栈中,而引用类型存储在托管堆上。注意区分某个类型是值类型还是引用类型,由于这种存储位置的不同会有不同的影响。例如,in t是值类型,这表达下面的语句会在内存的两个地方存储值2 0:/i 和j 都是整型变量i=20;j=i;但考虑下面的代码。这段代码假定己经定义了一个类classl,c 1 ass 1 是一个引用类型,它有一个i n t 类型的成员变量Vai u e:cl a s s 1 x,yx=n ew c la s s l();x.Val u e 3 0;y=x;Console.W r it e L i n e(y.Value);/输出 30y.Va 1 ue=50;C o ns o le.Wri t eLi n e(x.Valu e);/输出 50要理解的重要一点是在执行这段代码后,只有一个classl对象。x 和 y 都指向包含该对象的内存位置。由于x 和 y 是引用类型的变量,声明这两个变量只是保存了一个引用一一而不会实例化给定类型的对象。由于x 和 y 引用同一个对象,所以对x 的修改会影响y,反之亦然。因此上面的代码会显式30和 50。假如变量是一个引用,就可以把其值设立为nu I I,拟定它不引用任何对象:y=n u 1 1;在 C#中,基本数据类型如b o o l和 lo n g 都是值类型。假如声明一个b o o l变量,并给它赋予另一个b o o l 变量的值,在内存中就会有两个b o o l值。假如以后修改第一个boo 1变量的值,第二个b o o l 变量的值也不会改变。这些类型是通过值来复制的。相反,大多数更复杂的C#数据类型,涉及我们自己声明的类都是引用类型。它们分派在堆中,其生存期可以跨多个函数调用,可以通过一个或几个别名来访问。CLR(Common La n guage R u ntim e 公共语言运营库指.N E T 的运营时支持,涉及一个面向对象类型系统和一些运营时服务)执行一种精细的算法来跟踪哪些引用变量仍是可以访问的,哪些引用变量已经不能访问了。C L R 会定期进行清理,删除不能访问的对象,把它们占用的内存返回给操作系统。这是通过垃圾收集器实现的。1.2 预定义类型C#认可的基本预定义类型并没有内置于语言中,而是内置于.N ETFram ew ork中。例如,在 C#中声明一个i n t 类型的数据时,声明的事实上是.NET结构S yste m.I nt32的一个实例。C#支持两个预定义的引用类型,如下表:C T S:公共类型系统名 称CTS类说 明O b j ec tS yste m.Obje c t根类型,其他类型都是从它派生而来的(涉及值类型)S t r i ngS y s tem.S tr ingUnicode字符串1.o b ject 类型在 C#中,object类型就是最终的父类型,所有内在和用户定义的类型都从它派生而来。这是 C#的一个重要特性,objec t 类型就可以用于两个目的:可以使用。bj e c t引用绑定任何特定子类型的对象。o bj e c t 类型执行许多基本的一般用途的方法,涉 及 Equal s()、GetH a shCode()、GetType。和 ToSt r in g()。用户定义的类也许需要使用一种面向对象技术重写,提供其中一些方法的替代执行方法。例如,重 写 T。String。时,要给类提供一个方法,该方法可以提供类自身的字符串表达。假如类中没有提供这些方法的实现,编译器就会在对象中选择这些实现,它们在类中的执行不一定对的。2.stri n g 类型C#有 st r in g 关键字,在翻译为.NET类时,它就是Sys tem.string。有了它,像字符串连接和字符串复制这样的操作就很简朴了:stri n g strl=Hellostrin g str 2=Wo r Id 0;s t r i n g str 3=st r 1 +st r2;字符串连接尽管这是一个值类型的赋值,但 str i n g 是一个引用类型。String对象保存在堆上,而不是堆栈上。因此,当把一个字符串变量赋给另一个字符串时,会得到对内存中同一个字符串的两个引用。但是,s t ring与引用类型在常见的操作上有一些区别。例如,修改其中一个字符串,注意这会创建一个全新的st ri n g 对象,而另一个字符串没有改变。考虑下面的代码:u s ing Sys t em;c la s s S t r i n gExam p le(p u blic s t a ti c int Ma i n()s t ring si=a strin gs t rin g s2=si;Console.Writ e L i n e(nsl i s”+s i);Con s ole.WriteLine(s2 is +s2);si=ano t her s t r i n g”;Cons o le.Wr i teLi n e(si i s n o w +s 1);C o ns o le.Writ e L i n e(s2 is no w n+s 2);retu r n 0;)其输出结果为:si i s a strin gs2 is a s trin gsi is now anoth e r s trings2 is now a string换言之,改变s i 的值对s2没有影响,这与我们期待的引用类型正好相反。1.3类型转换1.隐式转换隐式转换就是系统默认的、不需要加以声明就可以进行的转换。隐式转换一般不会失败,转换过程中也不会导致信息丢失。隐式转换涉及下面几种:从 sbyte 类型到 short,int,long,float,double,或 decimal 类型。从 byte 类型到 short,ushort.int,uiiit,long.ulong?float,double,或 decimal 类型。从 short 类型到 mt.long,float,double,或 decimal 类型。从 ushort 类型到 int,umt,long,ulong.float,double,或 decimal 类型。从 int 类型到 long,float,double,或 decimal 类型 从 uint 类型到 long,ulong,float,double,或 decimal 类型。从 long 类型到 float,double,或 decimal 类型。从 ulong 类型到 float,double,或 decimal 类型。从 char 类型至ll ushort,mt,umt,long,ulong,float double,或 decimal 类型。从float类型到double类型。2.显式转换显式类型转换,就是强制类型转换。与隐式转换正好相反,显式转换需要用户明确指定转换的类型,不如看下面例子:Ion g 1 =5 000;int I=(in t)1;显式转换可以发生在表达式的计算过程中。它并不是总能成功,并且经常也许引起信息丢失。显式转换涉及所有的隐式转换。显式转换涉及下面几种:从 sbyte 至U byte,ushort,uint:ulong:或 char。从 byte 到 sbyte 或 chare从 short 至【J sbyte,byte,ushort.umt.ulong,或 char。从 ushort 至U sbyte.byte,short,或 char。从 int 至ij sbyte.byte,short,ushort.umt.ulong,或 char。从 umt 至lj sbyte,byte,short,ushort int,或 char。从 long 至【J sbyte.byte,short,ushort,int,uint,ulong,或 char。从 ulong 至lj sbyte,byte,short,ushort,int,uint,long,或 char。从 char 到 sbyte.byte,或 shorto从 float 到 sbyte;byte,short,ushort.mt,uint,long,ulong.char.或 decunaL从 double 至Isbyte,byte,short,ushort,int,uiiit,long,ulong,char,float,or 或1.4 装箱和拆箱装箱和拆箱使我们可以把一个值类型当作一个引用类型看待。装箱转换是指将一个值类型隐式的转换成一个O b je c t类型,拆箱转换是指将一个0 b j e c t 类型显式地转换成一个值类型,他们互为逆过程。装箱(b o xi n g)装箱转换是指将一个值类型隐式转换成一个obj e c t 类型,或者把这个值类型转换成一个被该值类型应用的接口类型。把一个值类型的值装箱,也就是创建一个o b j e c t 实例并将这个值给这个obj e t.不如:Int i=1 0;Obj ect o b j=i;拆 箱(u n b ox i n g)拆箱转换是指将一个对象类型显式转换成一个值类型,或是将一个接口类型显示地转换成一个执行该接口的值类型。拆箱的过程分为两步:一方面,检查这个对象的实例,看它是否为给定的值类型的装箱值。然后,把这个实例的值拷贝给值类型的变量。如:Inli=1 0;O bj e c to b j=i;I n tj=(int)o b j;二变量、常量2.1 v变量在 C#中声明变量使用下述语法:dat a t ype i d en t ifier;例如:inti;一旦它被声明之后,就可以使用赋值运算符(=)给它分派一个值:i=10;还可以在一行代码中声明变量,并初始化它的值:in t i=10;假如在一个语句中声明和初始化了多个变量,那么所有的变量都具有相同的数据类型:i n t x=10,y=20;要声明类型不同的变量,需要使用单独的语句。在多个变量的声明中,不能指定不同的数据类型:i n t x=10;bo o 1 y=tr u e;int x=1 0,b oo 1 y=t r u e;/这样编译报错1.变量的初始化变量的初始化是C#强调安全性的另一个例子。简朴地说,C#编译器需要用某个初始值对变量进行初始化,之后才干在操作中引用该变量。大多数现代编译器把没有初始化标记为警告,但 C#编译器把它当作错误来看待。这就可以防止我们无意中从其他程序遗留下来的内存中获取垃圾值。C#有两个方法可保证变量在使用前进行了初始化:变量是类或结构中的字段,假如没有显式进行初始化,在默认状态下当创建这些变量时,其值就是0。方法的局部变量必须在代码中显式初始化,之后才干在语句中使用它们的值。此时,初始化不是在声明该变量时进行的,但编译器会通过方法检查所有也许的途径,假如检测到局部变量在初始化之前就使用了它的值,就会产生错误。同样的规则也合用于引用类型。考虑下面的语句:Somet h ing o b jS o met h ing;在 C#中,这行代码仅会为Something对象创建一个引用,但这个引用还没有指向任何对象。对该变量调用方法或属性会导致错误.在 C#中实例化一个引用对象需要使用new关犍字。如上所述,创建一个引用,使用new关键字把该引用指向存储在堆上的一个对象:ob j Somet h i ng=n ew S om e t h i n g();/This e re a tesa Some t h i ng o n t h e hea p2.变量的作用域变量的作用域是可以访问该变量的代码区域。一般情况下,拟定作用域有以下规则:只要字段所属的类在某个作用域内,其字段(也称为成员变量)也在该作用域内局部变量存在于表达声明该变量的块语句或方法结束的封闭花括号之前的作用域内。在 f o r、while或类似语句中声明的局部变量存在于该循环体内。局部变量的作用域冲突大型程序在不同部分为不同的变量使用相同的变量名是很常见的。只要变量的作用域是程序的不同部分,就不会有问题,也不会产生模糊性。但要注意,同名的局部变量不能在同一作用域内声明两次,所以不能使用下面的代码:i n t x=2 0;/其它代码int x=3 0;字段和局部变量的作用域冲突在某些环境下,可以区分名称相同(尽管不是通过完全限定的名称)、作用域相同的两个标记符。此时编译器允许声明第二个变量。因素是C#使得变量之间有一个基本的区分,它把声明为类型级的变量看作是字段,而把在方法中声明的变量看作局部变量。2.2、常量在声明和初始化变量时,在变量的前面加上关键字co n st,就可以把该变量指定为一个常量。顾名思义,常量是其值在使用过程中不会发生变化的变量:c o nst i n t a=100;变量的值不能改变C#中只能把局部变量利字段声明为常量。常量具有如下特性:常量必须在声明时初始化。指定了其值后,就不能再修改了。常量的值必须能在编译时用于计算。因此,不能用从一个变量中提取的值来初始化常量。假如需要这么做,应使用只读字段。常量用易于理解的清楚的名称替代了 含义不明确的数字或字符串”,使程序更易于阅读。常量使程序更易于修改。例如,在 C#程序中有一个S alesT ax常量,该常量的值为 6%。假如以后销售税率发生变化,可以把新值赋给这个常量,就可以修改所有的税款计算,而不必查找整个程序,修改税率为0.06的每个项。常量更容易避免程序出现错误。假如要把另一个值赋给程序中的一个常量,而该常量已有了一个值,编译器就会报告错误。三运算符和表达式3.1、运算符、表达式算术操作符和算术表达式+加 法 操 作 符-减法操作符*乘法操作符/除法操作符%求余法操作符例:加法表达式Enum We e kda ySu n day,Monda y,Tue s d ay,Wednesday/!h u r sday,F riday,Saturda y;Weekd a y d a y 1=w eekday.S u nday;Wee k d a y d ay2=d a y 1+2;C o ns o 1 e.Wr i teL i ne(day 2);结果是:T u e sd a y赋值运算符=+=-=*=/=&=A=-=是最简朴的赋值运算符,其它的是复合赋值,X+=5 等价于X=X+5;关系运算符=等于!=不等于 大于=大于等于【s 运算符I s 元算符被用于动态的检查运营时对象类型是否和给定的类型兼容。运 算“e isT”的结果,其中,e 是一个表达式,T 是一个类型,返回值是一个布尔值。它表达,e 是否能通过引用转换,装箱转换,成功的转换于T 类型。如:1 i s in t结果是:trueA s 操作符As 操作符通过引用转换或装箱转换将一个值显式地转换成指定的引用类型。不像显式类型转换,a s 不会产生任何异常。假如转换不可以进行,那么结果值为null。形 如“easT”的运算,e是一个表达式,T 是一个引用类型。返回值的类型总是T 的类型,并且结果总是一个值。如:a s s t ring;虽然,字符型不能转换为字符串类型,程序可以通过,但是有一个警告。位运算&与I 或人 异或 取补 左移 右移3.2、特殊运算符三元操作符?:条件表达式b?x :y ,先计算条件b,然后进行判断。假 如 b的值为t r ue,计算x的值,运算结果为x 的值;否则,计 算 y,运算结果为y值。一个表达式,从不会即计算x值,又计算y值。条件表达式是向右关联,例如:a?b :c?d:e 将 按 a?b:(c?d :e)的形式执行。自增和自减操作符+一就是对变量自身加一或者减一,注意,自增和自减运算符必须是对一个变量,一个属性访问器,一个索引访问器,而不能是常量或其表达式,如:5+,(x+y)+都是非法的。自增和自减操作符有前缀和后缀之分,前缀遵循“先增减,后使用”,后缀遵循“先使用后增减”。N e w 操作符一般用于创建一个新的类型实例,如:c l as s A A a-ne w A();改运算符尚有其它更多的用法,具体如下:在 C#中,n ew关键字可用作运算符、修饰符或约束。1)n e w运算符:用于创建对象和调用构造函数。这种大家都比较熟悉,没什么好说的了。2)n e w修饰符:在用作修饰符时,new关键字可以显式隐藏从基类继承的成员。3)n e w约束:用于在泛型声明中约束也许用作类型参数的参数的类型。关于第二种用法看下例:u s in g System;n ames p a c e Cons o I e Appl i cat i onl(public cla s s Base Apubl i c int x=1;publ i c void I n v o k e()(Con s ole.Wri t eLine(x.ToS t ri ng();pub 1 ic in t T r ueValuege t re t u rn x;s e t x=v a lu e;?public c lass Der i v e dB:Base Anew pub 1 i c in t x=2;new pub 1 ic vo i d Invoke()Consol e.Wri t eLin e(x.ToS t r i n g();?n e w pu b I i c i nt T r ueV a lueg e t ret u r n x;se t x=v alue;?clas s Tests tatic void Ma i n(stri ng arg s)(De r iv e dB b=new D e rivedB();b.Invoke。;调用 DerivedB 的 I nvoke 方法,输出:2C o nsole.Wr i t e Li n e(b.x.ToS t r i n g();输出 DerivedB 的成员 x 值:2BaseA a=b;a.1 n voke();调用 Ba s eA的 I nvo k e 方法,输出:1a.TrueValu e=3;调 用Base A的属性Tru e Valu e,修改BaseA的成员x的值C onsole.WriteLine(a.x.T o St r i ng();输出 Bas e A 的成员 x 的值:3Console.Wri t eLine(b.Tru e V a lue.ToStr i ng。);输出 DerivedB 的成员 x 的值,仍然是:1可见,要想访问被隐藏的基类的成员变量、属性或方法,办法就是将子类造型为父类,然后通过基类访问被隐藏的成员变量、属性或方法。new约束指定泛型类声明中的任何类型参数都必须具有公共的无参数构造函数.请看下例:using System;using System.Col 1 e c t i on s.G e neric;namesp a c e Conso 1 eApp 1 icat i o n 2(public class Em p 1 oye e(p r i vate st r i n g n a me;private i n t id;p u b lie Em p loye e()name=Temp ;i d=0;)p u blic Employee(s tring s,int i)nam e=s;id=i;)pub 1 i c s tr i ng N a meget retu r n nam e;se t)public int I Dge t r e tu r n id;set id=val u e;)class 11 emF a ctor y where T(pu b lie T Ge t Newltem()return new T();)pu b lie clas s Tes tnew()p ub 1 i c s t atic voi d M a in()11 c mFac t ory Emp 1 oyee Facto ry=n e w!temFa ctory();/此处编译器会检查Emp 1 o y e e是否具有公有的无参构造函数。/若 没 有 贝|J会有 The Emplo y ee must have a p u b 1 i c p aram e terless c o nstr uc to r错误。Co nsole.Wri t eL i ne(0 I D is 1 ,Emp 1 oyeeF a c t o r y.GetNewI te m().Name,EmployeeFa ctory.GetN e w Item().ID);)T y p e o f 操作符用于获得系统原形对象的类型。如:t y pe。f(int)等 于int32.C h ec k ed 和 unche c ked 操作符Checked和unchecked操作符用于整形算术运算时控制当前环境中的溢出检查。Con s tin tx=1000 0 00;Const in t y=1 0 0 0000;R e t urn ch e c ke d(x*y)编译时会报溢犯错误3.3、优先级别当一个表达式包含多个操作符时,操作符的优先级控制着单个操作符的求值顺序.表7-1操作符从高到低的优先级顺序类别操作符初级操作符(x)x.y Hx)ax x+x-new type of sizeof checked unchecked一元操作符+!+x-x(T)x乘、除操作符*/%加减操作符+.移位操作符 关系操作符 =is as等式操作符i逻辑与操作的&逻辑异或操作符A逻辑或操作符条件与操作附&条件或操作符条件悚作符?:鼠值操作符=/=%=+=.=&=八=|=四流程控制4.1、条 件语句条件语句可以根据条件是否满足或根据表达式的值控制代码的执行分支。c#有两个分支代码的结构:i f 语句,测试特定条件是否满足;s w itc h 语句,它比较表达式和许多不同的值。1.if语句语法都是非常直观的:if(con d iti o n)sta t ement(s)e l s estatemen t(s)还可以单独使用i f 语句,不加e ls e 语句。也可以合并else i f 子句,测试多个条件。2.s w it c h 语句s wi t ch-case语句适合于从一组互斥的分支中选择一个执行分支。其形式是s wi t ch参数的后面跟一组cas e 子句。假 如 sw itc h 参数中表达式的值等于某个c a se子句旁边的某个值,就执行该case子句中的代码。此时不需要使用花括号把语句组合到块中;只需使用br e a k 语句标记每个case代码的结尾即可。也可以在sw i tc h 语句中包含一个default子句,假如表达式不等于其他c a s e 子句的值,就执行de f a u l t 子句的代码。下面的s w i t ch 语句测试i n t ege r A 变量的值:switc h(i n t ege r A)case 1 :C o n s o 1 e.W ri t e L i ne(i nte g e r A =1 );b re a k;ca s e 2 :C o ns o l e.W r i te L i ne(i nte g e r A =2M);b re a k;c as e 3 :C o nso l e.W r i t e L i n e(i nte g e rA =3 );b r e a k;d e f a ul t:C o nso l e.W r i t e L i n e (ui n te g e rA i s n o t 1,2 ,o r 3 n);b re a k;)注意c a se 的值必须是常量表达式不允许使用变量。4.2、循环语句C#提供了 4种不同的循环机制(f o r、wh i l e、d o-wh i l e 和 f o re a c h ),在满足某个条件之前,可以反复执行代码块。1.for循环C#的 f o r循环提供的迭代循环机制是在执行下一次迭代前,测试是否满足某个条件,其语法如下:for(i niti a liz e r;co n ditio n;i t e r a t or)s t at e ment(s)其中:initializer是指在执行第一次迭代前要计算的表达式(通常初始化为一个局部变量,作为循环计数器);condit i on是在每次迭代循环前要测试的表达式(它必须等于tru e,才干执行下一次迭代);iter a t o r 是每次迭代完要计算的表达式(通常是递增循环计数器)。当 c。ndition等于 fa 1 s e 时,迭代停止。fo r循环是所谓的预测试循环,由于循环条件是在执行循环语句前计算的,假如循环条件为假,循环语句就主线不会执行。fo r循环非常适合用于一个语句或语句块反复执行预定的次数。下面的例子就是使用for循环的典型用法,这段代码输出从0 9 9 的整数:fo r(i nt i=0;i 0)isum+=i;)3.do.whil e 循环do-wh i 1 e 循环是w h i 1 e 循环的后测试版本。do-while循环适合于至少执行一次循环体的情况:i n t i =1 0,sum =0;d oi;s um +=i;wh i l e (i 0);4.f or ea ch 循环forea c h 循环是我们讨论的最后一种C#循环机制。也是非常受欢迎的一种循环。从下面的代码中可以了解fore a c h 循环的语法,其中假定ar r ayO f In t s 是一个整型数组:i n t n u m b e r s =4,5,6,1,2,3,-2,-1 ,0 ;f o r e a ch (i nt i i n num b e rs)(S yste m.C o n s o 1 e.W ri t e L i ne (i);)其中,for e a c h 循环一次迭代数组中的一个元素。对于每个元素,它把该元素的值放在in t 型的变量temp中,然后再执行一次循环迭代。假如需要迭代集合中的各项,并改变它们的值,就应使用fo r 循环。4.3、跳转语句C#提供了许多可以立即跳转到程序中另一行代码的语句,在此,先介绍goto语句。1.g o t o语句go t。语句可以直接跳转到程序中用标签指定的另一行(标签是一个标记符,后跟一个冒号):goto L a b ell;Console.Wri t e L ine(u Th i s wo nt b e exe c u te d);L a bel 1 :Cons o 1 e.W ri t eLine(H Co n t i n ui n g execution from here );goto语句有两个限制。不能跳转到像f O r 循环这样的代码块中,也不能跳出类的范围,不能退出t ry.catch块后面的f ina 1 1 y 块。goto语句的名声不太好,在大多数情况下不允许使用它。一般情况下,使用它肯定不是面向对象编程的好方式。前面简要提到过b r e a k 语句一一在 s witch语句中使用它退出某个c ase语句。事实上,b r eak也可以用于退出fo r、fore a ch、whi 1 e 或 do.while循环,循环结束后,立即执行后面的语句。假如该语句放在嵌套的循环中,就执行最内部循环后面的语句。假 如 11 放 在 5 亚 1t Ch语句或循环外部,就会产生编译时错误。2.contin u e 语句continue 语句类似于 b r e ak,也必须用于 f or、f ore a ch,w h ile 或 do.w h ile 循环中。但它只从循环的当前迭代中退出,然后从循环的下一次迭代开始重新执行,而不是退出循环。3.ret u rn 语句return语句用于退出类的方法,把控制返回方法的调用者,假如方法有返回类型,return语句必须返回这个类型的值,假如方法没有返回类型,应使用没有表达式的re tu rn语句。4.4、异常解决T r y-cat c h(s)T ry -f ina 1 lyTry-catch(s)-f i na 1 ly五 程 序 结 构5.1、类c#中的类是对数据结构的封装,是c#最重要的组成部分。我们运用类定义各种新的数据类型,其中既包含数据内容,有包含数据操作,封装之后,类可以控制外界对它成员的访问。类的静态成员属于类,非静态成员属于这个类的某个实例。在一个类的实例一一对象的生命周期中,最先执行的代码是类的构造函数,构造函数总是用来初始化对象的特殊类型的函数。不带参数的类的构造函数对类的实例的初始化始固定的,我们也可以使用带参数的构造函数,通过向他传递参数来对类的不同实例进行不同的初始化。构造函数同样也可以使用默认参数。当这个类的实例超过了作用域的时候,或者由于其它理由被破坏时,析构函数将释放分派给该实例的任何存储区。5.2、命名空间命名空间提供了一种组织相关类和其它类型的方式。与文献或组件不同,命名空间时一种逻辑组合,而不是物理组合,在c#文献中定义类时,可以把它包含在命名空间的定义中,以后在定义另一个类,在另一个文献中执行相关操作时,就可以在同一个命名空间中包含它,创建一个逻辑组合,告诉其它使用类的开发人员如何使类相关,和对他们进行使用。命名空间可以嵌套。如:Namespac e ANames p a c e BN amespa c e C代码块每个命名空间名都由他所在的命名空间的名称组成,这些名称用句号隔开,一方面是最外层,最后是自己的名字。如:上面的例子也可以写成:N ame s p ace A.B.C(代码块不允许在另一个嵌套的命名空间中声明多部分的命名空间。也不能在同一命名空间中有两个同名的类。5.3 v Main 方法C#程序是从方法Main()开始执行的。这个方法必须是类或结构的静态方法,并且其返回类型必须是i n t 或 void。虽然显式指定public修饰符是很常见的,由于按照定义,必须在程序外部调用该方法,但我们给该方法指定什么访问级别并不重要,即使把该方法标记为private,它也可以运营。在调用程序时,可以让C L R 包含一个参数,将命令行参数转送给程序。这个参数是一个字符串数组,传统称为a r g s (但 C#可以接受任何名称)。在启动程序时,可以使用这个数组,访问通过命令行传送过来的选项。下面的例子Args E x a m p le.c s是在传送给Ma i n 方法的字符串数组中迭代,并把每个选项的值写入控制台窗口:u s i n g S y s t e m ;u s i n g S y s t e m.C o 1 l e c t i o n s.G e n e r i c;u s i n g S y s t e m.T e x t ;n a m e s p a c e C o n s o l e A p p l i c a t i o n 2(c l a s s P r o g r a m(s t a t i c v o i d M a i n (s t r i n g a r g s)(f o r (i n t i =0 ;i a r g s .L e n g t h;i +)(C o n s o 1 e.W r i t e L i n e (a r g s i );)通常使用命令行就可以编译这段代码。在运营编译好的可执行文献时,可以在程序名的后面加上参数,例如:在d os命令行中输入:存储目录/C o n s o l e A p p l i c a t i o n 2/a/b/c输出:/aZ b/c六程序例子6.1 V 类的定义,继承,使用,类方法的重写u s i n g S y s t e m;u s i n g S y s t e m.C o 1 1 e c t i o n s.G e n e r i c;u s i n g S y s t e m.T e x t;n a m e s p a c e C o n s o l e A p p l i c a t i o n 1(c l a s s V e h i c l e(p u b 1 i c i n t w h e e 1 s;p u b 1 i c f 1 o a t w e i g h t;p u b l i c v o i d F ()w h e e l s =4;w e i g h t =1 0;)c l a s s C a r:V e h i c l e(i n t p a s s e n g e r s ;p u b l i c v o i d F()w e i g h t =8;w h e e 1 s8 ;V e h i c l e v =n e w V e h i c l e O ;v.w h e e l s =4;v .w e i g h t =6;p a s s e n g e r s =1 0 ;C o n s o l e.W r i t e L i n e(,z 0 1 2 3 4 ,v .w h e e l s,v.w e i g h t,w h e eI s,w e i g h t,p a s s e n g e r s);)p u b 1 i c o v e r r i d e s t r i n g T o S t r i n g()s t r i n g R e s u 1 t =继承来的 w e i g h t :+w e i g h t.T o S t r i n g ()+”实例化 V e h i c l e的w e i g h l:+w e i g h t.T o S t r i n g()+”自己的属性p a s s e n g e r s:+p a s s e n ge r s.T o S t r i n g O ;r e t u r n R e s u l t ;)c l a s s P r o g r a m(s t a t i c v o i d M a i n(s t r i n g a r g s)(C a r s =n e w C a r ();s.F();C o n s o 1 e.W r i t e L i n e (s.T o S t r i n g ();)6.2、运算符重载运算符重载注意事项:a.可被重载的一元操作符:+、-、!、(取补)、+、-、tru e、fal s eb.可被重载的二元操作符:+、-、*、/、!、-(异或)、V、=、!=、=、=c.不允许被重载的操作符:&、|、=、?:、+=、一=、/=、=、I =、A=、=、=,事实上其中一些“复式操作符”在二元操作符被重载后自动生成,而不能显式定义d.必须成对重载的操作符:(=,!=)、(=,=)e.+、-操作符重载时不能区分其为前置或后置的根据经验值升级的例子u s i n g S y s t em;u s i n g Sy s t e m.C o l l e c t i o n s.G e n er ic;u s i n g S y s t em.Tex t;n am e s p ac e C o n s o l eA