常用Console.WriteLine原理,你知道嗎?
.NET里面如果有一個(gè)函數(shù)調(diào)用最多,那么莫過(guò)于Console.WriteLine了。它無(wú)處不在,基本上是.NET初學(xué)者入門的第一個(gè)函數(shù)調(diào)用,比如打印出那個(gè)著名的Hello World字符串。
static void Main(string[] args)
{
Console.WriteLine("Hello World");
}
有沒(méi)有好奇過(guò),它是如何通過(guò)從托管到非托管把字符串打印輸出到屏幕上的呢?本篇來(lái)看下,原理呢其實(shí)非常簡(jiǎn)單,通過(guò)CLR一系列的調(diào)用System.Console.dll里面的托管函數(shù)之后,最后會(huì)調(diào)用微軟原生的Windows動(dòng)態(tài)鏈接庫(kù)kernel32.dll里面的函數(shù)WriteFile。
WriteFile頭文件在fileapi.h,它的作用是將數(shù)據(jù)寫(xiě)入指定的文件或輸入/輸出 (I/O) 設(shè)備,原型如下:
BOOL WriteFile(
[in] HANDLE hFile,
[in] LPCVOID lpBuffer,
[in] DWORD nNumberOfBytesToWrite,
[out, optional] LPDWORD lpNumberOfBytesWritten,
[in, out, optional] LPOVERLAPPED lpOverlapped
);
返回值bool類型標(biāo)識(shí)了,寫(xiě)入成功或者失敗。
那么這個(gè)Console.WriteLine調(diào)用如下:
WriteLine(托管)-》
g__EnsureInitialized(托管)-》
GetStandardFile(托管)-》
ConsoleHandleIsWritable(托管)-》
WriteFile(非托管)
再引申下,Console.ReadLine呢?它跟Console.WriteLine是一樣的,不過(guò)它最后調(diào)用的是ReadFile函數(shù)了,從指定的文件或輸入/輸出 (I/O) 設(shè)備讀取數(shù)據(jù)。讀取發(fā)生在文件指針指定的位置。