|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我实在想不明白java的机制,为什么非要那么蛋疼,在同一个平台下重复编译。标准手动内存办理请求开辟职员办理内存块的分派和接纳。手动内存办理大概既耗时又贫苦。在C#中供应了主动内存办理,使开辟职员从这个沉重的义务中摆脱出来。在尽年夜多半情形下,主动内存办理能够进步代码质量和开辟职员的事情效力,而且不会对表达才能或功能形成负面影响。
示例
usingSystem;
publicclassStack
{
privateNodefirst=null;
publicboolEmpty{
get{
return(first==null);
}
}
publicobjectPop(){
if(first==null)
thrownewException("CantPopfromanemptyStack.");
else{
objecttemp=first.Value;
first=first.Next;
returntemp;
}
}
publicvoidPush(objecto){
first=newNode(o,first);
}
privateclassNode
{
publicNodeNext;
publicobjectValue;
publicNode(objectvalue):this(value,null){}
publicNode(objectvalue,Nodenext){
Next=next;
Value=value;
}
}
}
显现了一个Stack类,它实践上是Node实例的一个链接表。Node实例是在Push办法中创立的,当不再必要它们时会对其举行渣滓接纳。当任何代码都不再大概会见某个Node实例时,该实例就成为渣滓接纳的工具。比方,当从Stack中移除某项时,相干的Node实例就切合了渣滓接纳前提,守候被接纳。
示例
classTest
{
staticvoidMain(){
Stacks=newStack();
for(inti=0;i<10;i++)
s.Push(i);
s=null;
}
}
显现了利用Stack类的代码。该代码创立了一个Stack类,并用10个元素初始化该类,然后给它赋值null。给变量s赋了null值后,Stack及联系关系的10个Node实例变得切合渣滓接纳前提。渣滓接纳器能够当即扫除上述实例,但并没请求它必定做到当即扫除。
为C#服务的基本渣滓接纳器能够经由过程在内存中挪动工具来事情,而这类挪动关于年夜多半C#开辟职员是不成见的。关于那些一般满意于主动内存办理、但偶然又必要准确把持或渺小功能调剂的开辟职员,C#供应了编写“不平安”代码的才能。这类代码能够间接处置指针范例和工具地点。可是,C#请求程序员流动工具,临时制止渣滓接纳器挪动它们。
从开辟职员和用户的角度,这类“不平安”代码功效实践上是一种“平安”的功效。在代码中必需用润色符unsafe分明地标志出不平安代码,以便开辟职员不成能不经意地利用不平安言语功效,而且编译器和实行引擎协同事情,确保不平安代码没法冒充平安代码。这些限定将不平安代码的利用仅限于代码遭到信托的情形。
示例
usingSystem;
classTest
{
staticvoidWriteLocations(byte[]arr){
unsafe{
fixed(byte*pArray=arr){
byte*pElem=pArray;
for(inti=0;i<arr.Length;i++){
bytevalue=*pElem;
Console.WriteLine("arr[{0}]at0x{1:X}is{2}",
i,(uint)pElem,value);
pElem++;
}
}
}
}
staticvoidMain(){
byte[]arr=newbyte[]{1,2,3,4,5};
WriteLocations(arr);
}
}
显现了一个名为WriteLocations的办法。它含有一个不平安块,该块流动了一个数组实例,然后利用指针操纵完成逐一地会见该数组的元素。每一个数组元素的索引、值和地位被写进把持台。上面是一个大概的输入示例:
arr[0]at0x8E0360is1
arr[1]at0x8E0361is2
arr[2]at0x8E0362is3
arr[3]at0x8E0363is4
arr[4]at0x8E0364is5
固然,切实的内存地位大概因使用程序的分歧实行而异。
不可能天天有学习.net),我一同学说,你应该早就有作品啦。我惶惶然…… |
|