青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 124,  comments - 29,  trackbacks - 0

C#可否對內存進行直接的操作 ?
可以使用指針
在這篇文章中將描述C#的一個特性指針和所謂的不安全代碼。

非安全代碼

       非安全代碼就是不在 CLR 完全控制下執行的代碼,它有可能會導致一些問題,因此他們必須用 “unsafe” 進行表明:

       unsafe
       {
       ...
       // unsafe context: can use pointers here
       ...
       }

       在其他一些地方也可以使用關鍵字 ‘unsafe’,例如我們可以將類或方法表明為非安全的:

       unsafe class Class1 {}
       static unsafe void FastMove ( int* pi, int* pdi, int length) {...}

‘unsafe’ 關鍵字的必要性是它可以防止程序員的一些意外的用法。你可能會問既然是不安全的為什么還有人要用它。答案就是有時候,在有些情況下,還需要用到指針。

指針

       指針是一種用來存儲其他變量地址的特殊的變量,如果你把第一個變量的地址賦給第二個變量,你可以說第一個變量是指向第二個,CLR支持3種指針類型:受托管指針, 非托管指針和非托管函數指針。受托管指針存儲在堆上的托管塊的引用,一個非托管指針是傳統的C++指針并且每次使用必須要放在unsafe代碼塊中,一個非托管函數指針也是指向函數地址的傳統的C++指針(delegates 可以被看做是非托管函數指針).

       你可以像下面這樣的聲明來創建指針:類型* 變量_名稱;

       既然類型可以是任意一個非引用類型并且不包含引用類型字段,它只能是:sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool 和枚舉類型以及其他指針類型,也可以是任何用戶自定義的包括非托管類型字段的結構體.

       下面是不同類型指針聲明的示例:

       int* pi //declaration a pointer to integer variable
       float* pf, pq // two pointers to float variables. Not *pf, *pq
       char* pz // pointer to char

       就像前面說的非托管代碼CLR是不能驗證的,為了編譯你需要指定 /unsafe 編譯選項,如果你是使用的是Microsoft Visual Studio你需要在項目選項中把 'Allow unsafe code block'設置成 True。



指針的基本用法

還有一些與指針緊密聯系的操作符,那就是 & 操作符,& 返回它所操作對象的地址。

例如:
unsafe
{
int* pi;
int x = 1;
pi = &x;
System.Console.WriteLine("Value of x is: " + *pi);
}

在這個例子中我們創建了2個變量,’pi’是指向int的指針,’x’是int,然后我們將’x’在內存中的地址賦予’pi’,理解我們放在 ’pi’ 變量中的是 ’x’的地址而不是’x’的值非常重要 (使用: pi = x 將返回錯誤 "Cannot implicitly convert type 'int' to 'int*'")

編譯后執行將會輸出:

Value of x is: 1

指針可以接受 null 值,也可能使用 void 指針類型,下面的代碼可以正常編譯:

unsafe
{
nt x = 10;
void* px = &x;
double *pd = (double*)px;
}

fixed 關鍵字和垃圾回收

在 C# 中使用指針需要比在 C++種更加注意。這是因為垃圾回收器(g.c.)會運行內存清理,在清理的過程中,g.c.會改變對象的物理內存位置,如果 g.c.改變了對象的位置指針將指向錯誤的內存位置。為了避免這樣的問題(已經與垃圾回收器連接),C# 包含 'fixed' 關鍵字. 它通知系統不要讓垃圾回收器重新部署對象。

       如果我們忘了 ’fixed’ 關鍵字編譯器會給我們相應的警告,但它沒有智能到在下面的情況中也會警告我們。下面的代碼有一個嚴重的Bug盡管編譯很正常。

C# 指針和 WinApi

       使用指針最重要的好處就是可以與其他二進制代碼進行交互。許多 WinApi 函數都使用指針,例如GetComputerName (Kernel32.lib.)可以提供我們的計算機的名稱。

BOOL GetComputerName(LPTSTR lpBuffer, // computer name
LPDWORD lpnSize // size of name buffer);

下面的程序演示如何使用GetComputerName:

[System.Runtime.InteropServices.DllImport("Kernel32")]
static extern unsafe bool GetComputerName(byte* lpBuffer,long* nSize);
static void Main()
{
byte[] buffor = new byte[512];
long size = buffor.Length;
unsafe
{
long* pSize = &size;
fixed (byte* pBuffor = buffor)
{
GetComputerName(pBuffor,pSize);
}
}
System.Text.Encoding textEnc = new System.Text.ASCIIEncoding();
System.Console.WriteLine("Computer name: {0}",textEnc.GetString(buffor));
}

結論

       我們已經看到指針是C#語言中非常有用的部分,使用指針并不難但是要非常小心,因為有可能會導致難以診斷的問題,使用指針會擾亂垃圾回收器的功能,特別當我們在程序中大量使用指針。因此在之用指針之前我們應該多考慮,或者嘗試其他的解決辦法。

posted on 2009-02-19 15:22 天書 閱讀(2331) 評論(1)  編輯 收藏 引用

FeedBack:
# re: C# 能對內存進行直接操作嗎? 可以,但是要用unsafe來標示
2009-02-19 21:11 | 陳梓瀚(vczh)
熟練使用C++以及熟悉GC的人用C#的unsafe代碼一般沒問題。  回復  更多評論
  

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(5)

隨筆檔案

文章分類

文章檔案

好友的Bolg

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            性8sex亚洲区入口| 国产乱码精品一区二区三区忘忧草| 欧美国产精品va在线观看| 欧美一区午夜精品| 亚洲永久在线| 亚洲午夜在线| 亚洲欧美综合v| 欧美一区永久视频免费观看| 亚洲欧美日韩区| 欧美综合第一页| 免费不卡中文字幕视频| 亚洲第一精品夜夜躁人人爽| 国产欧美日韩激情| 国产一区二区福利| 亚洲国产精品久久久久秋霞影院 | 亚洲一区免费视频| 亚洲欧美日韩在线综合| 午夜精品久久久久久久99热浪潮 | 亚洲一区二区三区精品视频| 午夜亚洲福利| 欧美高清在线观看| 99国产一区| 欧美中文字幕在线播放| 欧美α欧美αv大片| 欧美性猛片xxxx免费看久爱| 国产亚洲女人久久久久毛片| 亚洲区中文字幕| 午夜精品视频| 亚洲第一网站免费视频| 亚洲在线免费视频| 欧美v亚洲v综合ⅴ国产v| 国产精品成人免费精品自在线观看| 国产视频久久网| 99精品久久免费看蜜臀剧情介绍| 性欧美8khd高清极品| 亚洲国产精品电影| 欧美在线视频导航| 欧美日韩在线电影| 亚洲国产精品一区二区www| 一本色道婷婷久久欧美| 久久久亚洲午夜电影| 在线视频你懂得一区| 免费视频最近日韩| 黑人中文字幕一区二区三区| 在线亚洲高清视频| 欧美国产日韩一区二区三区| 午夜欧美大片免费观看| 欧美精品aa| 亚洲高清一二三区| 久久性天堂网| 欧美一级久久久| 国产精品久久久久一区二区| 在线亚洲欧美视频| 亚洲黄色精品| 免费视频一区| 亚洲黄色影院| 亚洲第一精品夜夜躁人人爽| 久久综合影音| 亚洲成色777777女色窝| 老妇喷水一区二区三区| 亚洲欧美在线另类| 亚洲天堂av高清| 欧美日韩专区| 亚洲一级网站| 一区二区三区四区蜜桃| 欧美精品乱人伦久久久久久| 欧美黄色免费网站| 亚洲精选中文字幕| 91久久国产综合久久| 欧美高清视频免费观看| 日韩视频中午一区| 日韩视频中午一区| 欧美日韩一区二| 亚洲一区二区三区在线| 99国产精品久久久| 国产精品久久久久天堂| 欧美一区二区三区四区视频| 午夜精品福利在线观看| 国产欧美一区二区三区沐欲 | 最新日韩av| 欧美激情中文字幕在线| 欧美成人一区二区三区在线观看| 亚洲精品专区| 在线一区二区三区四区五区| 国产欧美va欧美va香蕉在| 老**午夜毛片一区二区三区| 欧美成人精品h版在线观看| 一区二区三区欧美在线观看| 亚洲午夜精品网| 狠狠爱www人成狠狠爱综合网| 亚洲激情在线| 国产精品自在在线| 欧美激情91| 国产精品一区二区你懂的| 欧美大片网址| 国产麻豆精品久久一二三| 米奇777超碰欧美日韩亚洲| 欧美人成在线| 久久久久久久一区二区| 欧美久久影院| 久久久夜精品| 国产精品theporn| 欧美国产三级| 国产一区二区三区四区在线观看| 亚洲国产欧美日韩另类综合| 国产精品久久午夜夜伦鲁鲁| 欧美超级免费视 在线| 欧美日韩在线三区| 久久伊人亚洲| 欧美视频在线观看 亚洲欧| 麻豆freexxxx性91精品| 国产精品黄视频| 卡通动漫国产精品| 麻豆精品在线视频| 午夜精品久久久久久久久久久久| 久久精品国产久精国产思思| 日韩视频一区二区三区在线播放| 亚洲午夜精品久久久久久app| 日韩视频一区二区三区在线播放免费观看| 在线综合亚洲| 精品69视频一区二区三区| 亚洲片区在线| 精品成人一区| 免费欧美在线视频| 久久精品最新地址| 欧美精品大片| 亚洲人精品午夜| 国产小视频国产精品| 亚洲国产精品一区二区第一页 | 悠悠资源网亚洲青| 亚洲欧美美女| 一区二区三区欧美激情| 久久精品国产清高在天天线 | 欧美性做爰毛片| 一本到高清视频免费精品| 在线播放日韩| 性欧美暴力猛交69hd| 中国成人亚色综合网站| 久久久免费观看视频| 亚洲人成7777| 欧美激情视频给我| 欧美成年人网站| 娇妻被交换粗又大又硬视频欧美| 性色av一区二区三区| 性8sex亚洲区入口| 国产亚洲a∨片在线观看| 亚洲天堂av图片| 亚洲综合视频1区| 欧美日韩国产精品| 亚洲国产成人午夜在线一区 | 欧美精品福利视频| 欧美成人tv| 亚洲国产中文字幕在线观看| 久久久久久久999精品视频| 亚洲精品一区中文| 一区二区三区久久| 怡红院av一区二区三区| 久久成人免费网| 欧美一级艳片视频免费观看| 国产精品国产三级国产专区53| 亚洲深夜福利网站| 亚洲免费网站| 国产精品丝袜91| 欧美一区二区三区免费大片| 久久久综合香蕉尹人综合网| 精品999久久久| 欧美成年人网站| 狠狠色丁香久久婷婷综合丁香| 美女图片一区二区| 亚洲免费电影在线| 欧美亚洲尤物久久| 狠狠干狠狠久久| 欧美精品一区二区三区一线天视频| 久久久午夜电影| 国产精品ⅴa在线观看h| 亚洲亚洲精品三区日韩精品在线视频 | 亚洲免费一区二区| 狠狠色综合网站久久久久久久| 国产日韩精品视频一区二区三区| 一区二区日韩欧美| 久久精品国产99精品国产亚洲性色| 日韩视频在线观看国产| 久久综合网络一区二区| 亚洲精品欧美极品| 国产精品a久久久久久| 亚洲午夜一区二区三区| 日韩一二在线观看| 国产夜色精品一区二区av| 久久综合网hezyo| 夜夜精品视频一区二区| 美女精品一区| 日韩视频在线你懂得| 国产精品亚洲а∨天堂免在线| 久久琪琪电影院| 亚洲伊人观看| 久久精品日产第一区二区| 一片黄亚洲嫩模| 伊人激情综合| 国产精品久久777777毛茸茸| 欧美jizzhd精品欧美喷水|