第一部分一.访问关键字:base,this~~~~base:访问基类的成员。用于从派生类中访问基类的成员,1.调用基类上已经被重写的方法。2.指定创建派生类实例时应调用的基类构造函数。**对基类的访问只能在派生类的构造函数实例的方法实例的属性访问器中。属性访问器:get,set函数。注意:!!!!!!!!!不能在静态方法中使用base关键字。例:在子类的方法中写base.GetInfo();调用基类的方法。基类中的构造函数重载了,Mybase()和Mybase(inti);在子类的构造函数中publicMyDerived():base(inti)publicMyDerived(inti):base()~~~~this:引用当前对象。用于引用为其调用方法的当前实例。静态成员函数没有this指针。可以用于从构造函数,实例方法,实例访问器中访问成员。this的一般用途:1.限定被相似的名子隐藏的成员publicvoidA(inta,intb){this.a=a;this.b=b;}2.将对象作为参数传递到函数中publicvoidShowInstance(){print(this);console.writeline(lalalalllalalala);}3.声明索引器publicintthis[intparam]{get{returnarray[param];}set{array[param]=value;}}注意!!!!!!静态方法,静态属性访问器或字段声明中不能用this。二.转换关键字:explicit,implicit,operator1~~~~explicit:用于声明用户定义的显式类型转换运算符。例:classMyType{publicstaticexplicitoperatorMyType(inti){//从int显式转换成MyType类型的代码!!!}}显式类型转换符必须通过类型转换调用。需要在转换失败时抛出异常。if(转换失败的条件)thrownewArgumentException();inti;MyTypex=(MyType)i;注意!!!!!!!如果转换可能导致信息丢失,则使用explicit关键字。2~~~~implicit:用于声明用户定义的隐式类型转换运算符。例:classMyType{publicstaticimplicitoperatorint(MyTypei){//从MyType隐式转换成Mint类型的代码!!!}}MyTypei;intx=i;注意!!!!!!!!!!!由于隐式转换在程序员未指定的情况下发生,所以必须防止出现不良的后果。只有在一定不会出现异常和信息丢失时才可以使用implicit,否则使用expicit。3~~~~operator:用于声明用户在类或结构中自定义的运算符。有四种形式:publicstatic结果类型operatorunary-operator(参数类型参数名)publicstaticimplictoperator目标类型(输入类型参数名)publicstaticexplictoperator目标类型(输入类型参数名)//implict中,目标类型一般是封闭类型,例如:int,double,byte等。//explict中,目标类型一般是自定义类型,例如:MyType等。三.文字关键字:null,false,true1~~~~null:表示不引用任何对象的空引用的值。null是引用类型的默认值。2~~~~true:true运算符:用户自定义的类型可以重载true运算符,用来表示是否满足条件,若满足则返回bool值的true,否则返回false。注意!!!!!!!若在自定义类型中定义了true运算符,则必须定义false运算符。true文字值:表示bool的真。3~~~~false:false运算符:用户自定义的类型可以重载false运算符,用来表示是否满足条件,若不满足则返回bool值的true,否则返回false。注意!!!!!!!若在自定义类型中定义了false运算符,则必须定义true运算符。false文字值:表示bool的假。true和false运算符可以用在任何条件判断中。四.方法参数关键字:params,ref,out1~~~~params:用于指定在参数数目可变处,采用参数的方法参数。只能有一个params,并且在他后面不能再有参数。~方法参数:如果在为方法声明参数时未使用ref或out,则该参数可以具有关联的值。可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值usingSystem;publicclassMyClass{publicstaticvoidUseParams(paramsint[]list){for(inti=0;ilist.Length;i++){Console.WriteLine(list[i]);}Console.WriteLine();}publicstaticvoidUseParams2(paramsobject[]list){for(inti=0;ilist.Length;i++){Console.WriteLine(list[i]);}Console.WriteLine();}staticvoidMain(){UseParams(1,2,3);UseParams2(1,'a',test);//Anarrayofobjectscanalsobepassed,aslongas//thearraytypematchesthemethodbeingcalled.int[]myarray=newint[3]{10,11,12};UseParams(myarray);}}输出1231atest101112//把1,2,3三个参数当成一个数组处理,在最后输出Console.WriteLine();2~~~~ref:使方法可以引用传递到该方法的参数。当程序跳转到调用方法处的时候,在方法中对参数所做的任何改动都将传递给参数。类似于传地址。注意!!!!!必须将参数作为ref参数显示的传递到方法。参数必须显示的初始化!属性不是变量不能作为ref参数传递。例子:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespace真的是关键字{classProgram{publicstaticvoidTestRef(refstringi){i=changeonce!;}publicstaticvoidTestNoRef(stringi){i=changetwice!;}staticvoidMain(string[]args){stringi=begining!;Console.WriteLine(i);TestRef(refi);Console.WriteLine(i);TestNoRef(i);Console.WriteLine(i);Console.ReadLine();}}}输出:beginning!Changeonce!Changeonce!3.~~~~out:使方法可以引用传递到该方法的同一个变量。当程序跳转到方法调用处时,在方法中对变量所做的任何改动都将传递给该变量。注意!!!!!当希望方法返回多个值时,声明out非常有用。一个方法可以有多个out参数。必须将参数作为out参数显示的传递到方法。不必初始化作为out参数的变量。属性不是变量不能作为out变量。注意!!!!!ref参数必须显示初始化,而out参数不用。例子:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespace真的是关键字{classProgram{publicstaticintTestOut(outstringi){i=changeonce!;return-1;}staticvoidMain(string[]args){stringi=begining!;Console.WriteLine(i);Console.WriteLine(TestOut(outi));Console.WriteLine(i);Console.ReadLine();}}}5.修饰关键字修饰符作用访问修饰符PublicPrivateInternalprotected指定声明的类型和成员的可访问性abstract指示某个类只能是其他类的基类,虚基类。Const指定无法修改字段或局部变量的值,只能在声明时初始化。Event声明一个事件Extern指示外部实现此方法Override提供从基类继承的虚拟成员的新实现Readonly声明的字段只能在声明时或构造函数中初始化。Sealed指定该类不能被继承Static声明对象属于类本身不属于特定的对象。Unsafe声明不安全的上下文Virtual在派生类中实现具体方法,可以重写。Volatile指示字段可以由操作系统,硬件或并发的线程等在程序中修改。1.访问关键字声明的可访问性意义public访问不受限制Protected访问仅限于包含类或从包含类派生的类Internal访问仅限于当前项目Protectedinternal访问仅限于包含类或从包含类派生的当前项目和类Private访问仅限于包含类不嵌套在其他类型中的顶级类型只能有public和internal可访问性,默认是internal。类型默认的成员可访问性允许的访问性枚举Public无(internal)PublicProtected类PrivateInternalPrivateProtectedinternal接口Public无(internal)Public结构PrivateInternalPrivate嵌套类型的可访问性取决于它的可访问域,而且不能超出包含它类型的可访问域。2.可访问域1.~~~~可访问域:用于指定程序段中可以引用该成员的位置。如果是嵌套类型,那么它的可访问域由成员的访问级别和直接包含该成员的类型的可访问域共同决定。usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespace真的是关键字{publicclassT1{publicstaticintpublicInt;internalstaticintinternalInt;privatestaticintprivateInt=0;//CS0414publicclassM1{publicstaticintpublicInt;internalstaticintinternalInt;privatestaticintprivateInt=0;//CS0414}privateclassM2{publicstaticintpublicInt=0;internalstaticintinternalInt=0;privatestaticintprivateInt=0;//CS0414}}classMainClass{staticvoidMain(){//Accessisunlimited:T1.publicInt=1;//Accessibleonlyincurrentassembly:T1.internalInt=2;//Error:inaccessibleoutsideT1://T1.myPrivateInt=3;//Accessisunlimited:T1.M1.publicInt=1;//Accessibleonlyincurrentassembly:T1.M1.internalInt=2;//Error:inaccessibleoutsideM1://T1.M1.myPrivateInt=3;//Error:inaccessibleoutsideT1://T1.M2.myPublicInt=1;//Error:inaccessibleoutsideT1://T1.M2.