Maison >tutoriels informatiques >connaissances en informatique >Principe de Console.WriteLine sous .NET9 Linux-x64
using (StreamWriter writer = File.CreateText("newfile.txt")) { await writer.WriteLineAsync("First line of example"); await writer.WriteLineAsync("and second line"); }
Par exemple :
static void Main(string[] args) { Console.WriteLine("Call Main"); }Console.WriteLine appellera la fonction Out.EnsureInitialized. Out est le type TextWriter. Le code est le suivant :
源码地址: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; } } } }La fonction EnsureInitialized appelle la fonction Volatile.Write. La fonction Volatile.Write signifie écrire la valeur du paramètre deux dans le champ du paramètre un. L'explication ici est d'écrire la valeur renvoyée par CreateOutputWriter(ConsolePal.OpenStandardOutput()) dans le champ s_out. s_out est également un type TextWriter.
Voici la valeur renvoyée par CreateOutputWriter(ConsolePal.OpenStandardOutput()). La fonction CreateOutputWriter est la suivante :
源码地址: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 }); }Vous pouvez voir que CreateOutputWriter renvoie toujours TextWriter, ce qui signifie que Volatile.Write écrit des données de flux pour diffuser des données, puis les imprime à partir de l'appareil.
Quelle est la valeur des données de flux écrite ici ? Continuez à regarder la fonction ConsolePal.OpenStandardOutput(), qui renvoie un type 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); }Voici les opérations sous Linux/Unix. Une classe UnixConsoleStream est instanciée dans OpenStandardOutput. Dans le constructeur d'UnixConsoleStream, le premier paramètre est Interop.CheckIo(Interop.Sys.Dup(Interop.Sys.FileDescriptors.STDOUT_FILENO)). Interop.Sys.Dup est une fonction sous Linux qui effectue des opérations de saisie de tables de fichiers. CheckIo est une fonction de vérification et peut être ignorée ici.
Par exemple, de manière générale, sous Linux, l'impression d'un hello World sur le terminal se fait généralement via printf (« hello Word »)
printf -> stdout(标准输出) -> Dup(STDOUT_FILENO) ->终端输出On peut voir que sous Linux, le paramètre STDOUT_FILENO est passé via la fonction Dup pour les opérations du terminal. Le deuxième paramètre d'UnixConsoleStream est FileAccess.Write, ce qui signifie écrire une chaîne. Encapsulez ensuite ce Stream et renvoyez-le, écrivez-le dans le flux du terminal via Volatile.Write et imprimez-le.
Ensuite, c’est en fait très clair. Le processus est à peu près le suivant :
Console.WriteLine ->Out.EnsureInitialized -> ConsolePal.OpenStandardOutput() -> I
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!