新聞中心
C#是.Net平臺上主流的開發(fā)語言,和經(jīng)典的C/C++不同的是,C#所編寫的代碼是托管代碼,由GC來管理內(nèi)存,省去了new/delete的煩惱。但是,由于某些特殊的要求,比如和底層的操作系統(tǒng)接口,訪問內(nèi)存映射設(shè)備或者實現(xiàn)對時間要求苛刻的算法時,提供了C#不安全代碼。

創(chuàng)新互聯(lián)建站服務(wù)項目包括托里網(wǎng)站建設(shè)、托里網(wǎng)站制作、托里網(wǎng)頁制作以及托里網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,托里網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到托里省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
不安全上下文
C#不安全代碼只能寫在不安全上下文中。
通過unsafe 修飾符可以修飾:
class, struct, interface, or delegate
field, method, property, event, indexer, operator, instance constructor, destructor, or static constructor
unsafe-statement-block
指針的類型
在不安全上下文中,指針類型和引用類型或是值類型一樣。但是,指針類型可以用在不安全上下文之外的typeof中,雖然這么做不安全。
Type t = typeof(Int32*);返回的是System.Int32*
pointer-type:
unmanaged-type
void
unmanaged-type:
type
非托管類型不是引用類型,也不包含任何嵌套的引用類型的成員。
非托管類型就是下面的一種:
◆sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, or bool.
◆Any enum-type.
◆Any pointer-type.
◆Any user-defined struct-type that contains fields of unmanaged-types only.
和C/C++不同的是,聲明多個指針變量需要:
int *p1,*p2;
但是在C#中,int* p1,p2就聲明了兩個指針變量,并且*是在類型之后,不是在變量名之前。
和引用類型相同的是,指針可以為null(所有位為0),如果訪問一個指向null的指針會引發(fā)不可預(yù)知的結(jié)果。
Void* 表示一個指針指向未知類型。因為指向未知類型,所以不能通過*來訪為指向的變量,也不能對指針進行數(shù)學(xué)運算。但是,void*可以轉(zhuǎn)換為任何指針類型,反之亦然。
指針類型是一個單獨的類型。指針類型不是繼承自System.Object,,并且兩者也不能互相轉(zhuǎn)換。同樣裝箱和拆箱也不適合指針類型。但是不同類型指針之間可以互相轉(zhuǎn)換。
指針類型不能用于類型參數(shù),當(dāng)泛型方法的類型參數(shù)為指針類型會調(diào)用失敗。
指針類型還可用于易變字段類型。
雖然指針還能通過ref和out來傳遞,但是會造成不可預(yù)知的行為,當(dāng)指針指向一個已經(jīng)不存在的本地變量,或是指向一個實際不再固定的固定對象。比如:
- usingSystem;
- classTest
- {
- staticintvalue=20;
- unsafestaticvoidF(outint*pi1,refint*pi2){
- inti=10;
- pi1=&i;
- fixed(int*pj=&value){
- //...
- pi2=pj;
- }
- }
- staticvoidMain(){
- inti=10;
- unsafe{
- int*px1;
- int*px2=&i;
- F(outpx1,refpx2);
- Console.WriteLine("*px1={0},*px2={1}",
- *px1,*px2);//undefinedbehavior
- }
- }
- }
方法可以返回指針類型。
- unsafestaticint*Find(int*pi,intsize,intvalue){
- for(inti=0;i
;++i){ - if(*pi==value)
- returnpi;
- ++pi;
- }
- returnnull;
- }
主要有幾個操作符:
◆ *被用作間接訪問
◆ ->被用作通過指針來訪為結(jié)構(gòu)的成員
◆ []用來做指針的索引器
◆ &用來獲得變量的地址
◆ ++和—用來自增和自減指針
◆ +和-用來做指針的算術(shù)運算
◆ ==, !=, <, >, <=, and =>用來比較指針
◆ stackalloc可以從棧上分配內(nèi)存
◆fixed用來臨時固定一個變量,所以它的地址總是可以得到的。以上介紹C#不安全代碼
網(wǎng)頁名稱:分析C#不安全代碼
地址分享:http://fisionsoft.com.cn/article/djehodh.html


咨詢
建站咨詢
