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
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

SublimeText3 Linux新版
SublimeText3 Linux最新版