1.前言
#之前聊過Windows下面Console.WriteLine的運行過程常用Console.WriteLine原理,你知道嗎?本篇看下它在Linu-x64下面最新.NET9運行過程
2.託管程式碼
在.NET中,通常使用StreamReader和StreamWriter這兩個類別來進行流讀寫入操作,它們的命名空間位於System.IO中。這些類別包含在託管庫System.Runtime.dll中。下面是一個簡單的範例操作:
using (StreamWriter writer = File.CreateText("newfile.txt")) { await writer.WriteLineAsync("First line of example"); await writer.WriteLineAsync("and second line"); }
StreamWriter和StreamReader分別衍生自TextWriter和TextReader。 Console.WriteLine列印出的字串,則是在CLR庫裡面直接透過TextWriter寫入到的資料流/裝置。
例如範例:
static void Main(string[] args) { Console.WriteLine("Call Main"); }
Console.WriteLine會呼叫Out.EnsureInitialized函數,Out即為TextWriter型,程式碼如下:
源码地址:https://github.com/dotnet/runtime/blob/main/src/libraries/System.Console/src/System/Console.cs public static TextWriter Out { get { static TextWriter EnsureInitialized() { lock (s_syncObject) { if (s_out == null) { Volatile.Write(ref s_out, CreateOutputWriter(ConsolePal.OpenStandardOutput())); } return s_out; } } } }
EnsureInitialized函數裡面呼叫了Volatile.Write函數,Volatile.Write函數的意思是,把參數二的值寫入到參數一字段裡面去。這裡的解釋就是把CreateOutputWriter(ConsolePal.OpenStandardOutput())回傳的值寫入s_out字段,s_out也是TextWriter型別。
這裡看下CreateOutputWriter(ConsolePal.OpenStandardOutput())回傳的值是啥。 CreateOutputWriter函數如下:
源码地址:https://github.com/dotnet/runtime/blob/main/src/libraries/System.Console/src/System/Console.cs private static TextWriter CreateOutputWriter(Stream outputStream) { return outputStream == Stream.Null ? TextWriter.Null : TextWriter.Synchronized(new StreamWriter( stream: outputStream, encoding: OutputEncoding.RemovePreamble(), bufferSize: WriteBufferSize, leaveOpen: true) { AutoFlush = true }); }
可以看到CreateOutputWriter回傳的依舊是TextWriter,也就是說Volatile.Write把流數據寫入到流數據,然後從設備上列印出來。
這裡寫入的流資料值到底是什麼呢?繼續看ConsolePal.OpenStandardOutput()函數,它回傳的是Stream類型。
源码地址: https://github.com/dotnet/runtime/blob/main/src/libraries/System.Console/src/System/ConsolePal.Unix.cs public static Stream OpenStandardOutput() { return new UnixConsoleStream(Interop.CheckIo(Interop.Sys.Dup(Interop.Sys.FileDescriptors.STDOUT_FILENO)), FileAccess.Write); }
這裡是Linux/Unix下面的操作,OpenStandardOutput裡面實例化了一個UnixConsoleStream類,UnixConsoleStream的建構子裡面,第一個參數是Interop.CheckIo(Interop.Sys.Dup(Interop.Sys.FileDescriptors.STDOUT_FILENO) )。 Interop.Sys.Dup是Linux下面進行文件表項操作的函數。 CheckIo則是個檢查函數,此處可以忽略。
舉個例子,一般的來說Linux下面在終端機上印出一個hello World通常透過printf(“hello Word”)
printf -> stdout(标准输出) -> Dup(STDOUT_FILENO) ->终端输出
可見Linux下面是透過Dup函數傳遞參數STDOUT_FILENO進行終端操作的,UnixConsoleStream第二個參數是FileAccess.Write,表示寫入字串。然後把這個Stream封裝後返回,透過Volatile.Write寫入到終端流裡面列印出來。
那麼其實很清晰了,流程大致如下:
Console.WriteLine ->Out.EnsureInitialized -> ConsolePal.OpenStandardOutput() -> I
以上是.NET9 Linux-x64下Console.WriteLine原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

這篇文章主要介紹Zoho郵件。了解如何註冊Zoho郵件並登錄您的Zoho郵件帳戶,以使用此電子郵件服務來查看和管理您的個人或業務電子郵件。

想在Excel中顯示公式嗎?想在Excel中隱藏公式嗎?從事這些工作並不難。 PHP.CN軟件收集了一些有用的方法,並在這篇文章中顯示了它們。此外,如果要恢復丟失的Excel文件,可以嘗試使用PHP

Google提供免費VPN嗎?什麼是Google一個VPN?您是否使用Google One獲得VPN?在這篇文章中,PHP.CN將向您展示有關此VPN服務的信息。此外,您可以下載Google for Desktop(Windows&MacOS)以訪問IN

您是否正在為“內部硬盤驅動器保持斷開Windows 10”問題而苦苦掙扎?此相關問題的原因有很多,您可以在PHP.CN網站上閱讀此帖子,以詳細解決故障排除措施並弄清楚其Trigg

FIFA 22/21是一款受歡迎的遊戲,沒有足球迷可以抵抗它。但是,由於某些原因,您將無法享受遊戲。您可能遇到的最常見問題之一是FIFA 22/21在PC上崩潰。如果您的FIFA 22保持

你們中的一些人發現,Hulu在打算觀看一些視頻時不會播放某些節目。為了解決Hulu丟失的情節,我們在PHP.CN網站上為您解決了一些潛在的原因和可行的解決方案。如果你也很困擾我

Google Drive為Windows和Mac提供應用程序。使用Google Drive桌面應用程序,您可以更輕鬆地同步文件。這篇來自Php.cn的帖子向您展示瞭如何下載,安裝和使用Windows的Google Drive。

超人是Wonder Games發布的最新戰鬥皇家遊戲之一,您可以在Steam客戶端免費下載它。當您玩此遊戲時,您可能會遇到超級人物滯後,低FP和口吃問題。幸運的是


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版
中文版,非常好用

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)