|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
是不是实质都是API?有的好像不只是API那么简单的,有的也是一种框架就像MFC一样。有的还是一种思想(就是做软件的思想)(好像很深奥,其实我也不懂^_^).net框架|条记|程序|计划第九章办法
1、实例机关器
1、后面提到用new操纵符创立工具时的三部曲:
l为工具分派内存
l初始化工具的附加成员(办法表指针和SyncBlockIndex)
l挪用实例机关器初始化实例形态
在分派内存时,体系将一切内存地位均置为0值,这就是为何字段初始化而未赋值时均为0或null值。
不挪用实例机关器的情形:
l挪用Object.MemberwiseClone()办法创立实例(分派内存;初始化附加成员;将源工具字节拷贝到新创立的工具)
l反序列化工具时
2、为制止为实例字段发生过量的机关器代码,应制止在声明字段时为字段符初值,而是在无参机关器中为它们符初值,在其他重载的机关器中挪用无参机关器。
3、值范例实例机关器
lC#编译器不会主动挪用其机关器,必需显式挪用机关器才干起感化
lC#编译器不同意为值范例界说无参实例机关器(上面会先容能够界说无参范例机关器)
l不克不及为布局中的字段在声明的同时赋初值,可经由过程界说带参机关器的体例举行
l必需在布局的机关器中为一切字段赋初值
2、范例机关器
1、范例机关器的一些限定:
l不克不及带任何参数
l范例机关器总为公有的,不克不及用其他会见润色符
2、范例机关器被挪用的机会:
l第一个实例被创立,大概范例的第一个字段或成员第一次被会见之前
l非承继静态字段被第一次会见之前
范例机关器在范例的性命周期中只被挪用一次;
3、一些限定:
l若范例机关器中抛出非常,则该范例酿成不成会见,会见个中的任何字段或办法均会抛出System.TypeInitializationException非常
l范例机关器只能会见范例的静态字段
l范例机关器不该该挪用基范例的范例机关器,因静态字段并不是承继而是编译时静态绑定
3、操纵符重载
1、操纵符重载
C#中对操纵符重载的一些限定:
l必需声明为publicstatic
l必需有一个参数为操纵符所属范例
l不克不及改动操纵符原始界说的引数个数
l若界说了true操纵符也必需同时界说false操纵符,两者都必需前往bool值
l++、--操纵符必需前往其所从属之范例的一个实例
l可被重载的一元操纵符:+、-、!、~、++、--、true、false
l可被重载的二元操纵符:+、-、*、/、%、!、^(异或)、<、>、<<、>>、==、!=、<=、>=
l不同意被重载的操纵符:&&、||、=、?:、+=、-=、/=、%=、|=、^=、<<=、>>=,实践上个中一些“复式操纵符”在二元操纵符被重载后主动天生,而不克不及显式界说
l必需成对重载的操纵符:(==,!=)、(<,>)、(<=,>=)
l++、--操纵符重载时不克不及辨别其为前置或后置的
2、操纵符重载与言语互操纵性
编译器会为重载的操纵符天生一个特别称号的办法,如+(加)操纵符天生op_Addition()办法,并为该办法的界说条目上加上specialname标志。当某种言语不克不及举行操纵符重载时,能够间接界说具有该特别称号的办法,以在其他言语中挪用;或间接挪用具有该特别称号的办法以顺应某种言语不克不及剖析操纵符的限定。如:vb中不克不及重载操纵符,可显式界说op_Addition()办法以在C#中挪用;C#中界说的+操纵符不克不及被VB辨认,可显式挪用op_Addition()办法取得一样的功效。
4、转换操纵符
转换操纵符的一些限定:
l必需为publicstatic
l必需指定关头字implicit或explicit,准绳为:从本范例转换为其他范例利用implicit,将其他范例转换为本范例用explicit,不克不及都利用implicit
5、办法参数
1、援用参数
l缺省情形下为值传送
l标记为out的参数,在挪用办法前不用初始化,但前往之前必需赋值,没有被初始化的参数是不克不及被利用
l标记为ref的参数,在挪用办法前必需初始化,不然触发编译毛病
l可使用ref或out来举行办法的重载,但不克不及经由过程辨别ref和out来重载办法
l按援用体例传送的变量(实参)必需和办法声明的参数(形参)范例完整不异,不然触发编译毛病。
2、可变数量参数
利用params关头字及工具数组的体例指定可变参数序列。一些限定:
l只要办法的最初一个参数才干利用可变数量参数
6、虚办法
1、虚办法的挪用机理
CLR利用以下两个IL指令挪用办法:
ucall依据范例(即援用的静态范例、声明范例)来挪用一个办法
ucallvirt依据工具(即援用的静态范例、实践范例)来挪用一个办法
关于虚办法利用call来挪用的情形有:
lbase.虚办法(),
l密封范例援用虚办法,由于没有需要查验密封范例的实践范例
l值范例,制止被装箱
利用callvirt挪用非虚办法的情形:
l使用变量为null时,利用callvirt才会抛出System.NullReferenceException非常,而call不会抛出
不管call或callvirt挪用办法,均会有一个隐含的this指针作为办法的第一个参数,它指向正在操纵的工具
2、虚办法的版本把持:
用上面的例子申明:
usingSystem;
classBaseClass
{
publicvoidNonVirtualFunc()
{
Console.WriteLine("Nonvirtualfuncinbaseclass");
}
publicvirtualvoidVirtualFunc()
{
Console.WriteLine("Virtualfuncinbaseclass");
}
}
classDevicedClass:BaseClass
{
//若不利用new关头字则编译器会有warning:
//“DevicedClass.NonVirtualFunc()”上请求关头字
//new,由于它埋没了承继成员“BaseClass.NonVirtualFunc()”
publicnewvoidNonVirtualFunc()
{
Console.WriteLine("Nonvirtualfuncindevicedclass");
}
//若不增加关头字override或new,则编译器会有warning:
//“DevicedClass.VirtualFunc()”将埋没承继的成员“BaseClass.VirtualFunc()
//”。若要使以后成员重写该完成,请增加关头字override。不然,增加关头字
//new。
publicoverridevoidVirtualFunc()
{
Console.WriteLine("Virtualfuncindevicedclass");
}
}
classTestClass
{
publicstaticvoidMain()
{
//派生类实例挪用非虚及虚函数
DevicedClassdc=newDevicedClass();
dc.NonVirtualFunc();
dc.VirtualFunc();
//基类实例挪用非虚及虚函数
BaseClassbc=newBaseClass();
bc.NonVirtualFunc();
bc.VirtualFunc();
//指向派生类实例的基类援用挪用非虚及虚函数
BaseClassbc1=dc;
bc1.NonVirtualFunc();
bc1.VirtualFunc();
}
}
/*
在虚函数上利用关头字override的运转了局:
Nonvirtualfuncindevicedclass
Virtualfuncindevicedclass
Nonvirtualfuncinbaseclass
Virtualfuncinbaseclass
Nonvirtualfuncinbaseclass
Virtualfuncindevicedclass
*/
/*
在虚函数上利用关头字new的运转了局
Nonvirtualfuncindevicedclass
Virtualfuncindevicedclass
Nonvirtualfuncinbaseclass
Virtualfuncinbaseclass
Nonvirtualfuncinbaseclass
Virtualfuncinbaseclass
*/
由上可见:new和override在派生类中和谐版本的把持,在第七章中已看到oeverride只能用于virtual办法,new则可用于非虚或虚办法,以完成埋没基类中的同名办法。在虚函数上利用override,重写了基类的办法,并没有埋没,这也就完成了多态。我们可假想如许的结论:new利用call指令挪用静态范例的办法,而override利用callvirt指令挪用静态范例的办法。
但愿这个例子对您的了解有所匡助。
我感觉可以顶到50楼,出乎意料的是大家居然纷纷写出自己的博文,还被编辑做成了专题,置于首页头条。 |
|