搜尋
首頁電腦教學電腦知識.NET9 Linux-x64下Console.WriteLine原理

.NET9 Linux-x64下Console.WriteLine原理

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中文網其他相關文章!

陳述
本文轉載於:每日运维。如有侵權,請聯絡admin@php.cn刪除
Zoho郵件登錄/註冊| Zoho Mail應用程序下載-MinitoolZoho郵件登錄/註冊| Zoho Mail應用程序下載-MinitoolApr 23, 2025 am 12:51 AM

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

如何在Microsoft Excel中顯示或隱藏公式? -  Minitool如何在Microsoft Excel中顯示或隱藏公式? - MinitoolApr 23, 2025 am 12:50 AM

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

現在Google可以將一個VPN下載到Windows和Mac供使用-Minitool現在Google可以將一個VPN下載到Windows和Mac供使用-MinitoolApr 23, 2025 am 12:49 AM

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

如何修復'內部硬盤驅動器保持斷開Windows 10”?如何修復'內部硬盤驅動器保持斷開Windows 10”?Apr 23, 2025 am 12:48 AM

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

如何修復FIFA 22在Windows 10/11上崩潰? -  Minitool如何修復FIFA 22在Windows 10/11上崩潰? - MinitoolApr 23, 2025 am 12:47 AM

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

如何修復Hulu缺少情節?嘗試這些修復程序! -  Minitool如何修復Hulu缺少情節?嘗試這些修復程序! - MinitoolApr 23, 2025 am 12:46 AM

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

如何下載和安裝Windows的Google Drive -Minitool如何下載和安裝Windows的Google Drive -MinitoolApr 23, 2025 am 12:45 AM

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

如何修復Windows 10/11上超級人員檢測到的加載滯後? -  Minitool如何修復Windows 10/11上超級人員檢測到的加載滯後? - MinitoolApr 23, 2025 am 12:43 AM

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

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SecLists

SecLists

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 Mac版

SublimeText3 Mac版

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