Ich habe bereits über die allgemeinen Prinzipien von Console.WriteLine im laufenden Prozess von Console.WriteLine unter Windows gesprochen. Wissen Sie? Dieser Artikel wirft einen Blick auf den neuesten .NET9-Laufprozess unter Linux-x64
In .NET werden die beiden Klassen StreamReader und StreamWriter normalerweise für Stream-Lese- und Schreibvorgänge verwendet, und ihre Namespaces befinden sich in System.IO. Diese Klassen sind in der verwalteten Bibliothek System.Runtime.dll enthalten. Hier ist eine einfache Beispieloperation:
using (StreamWriter writer = File.CreateText("newfile.txt")) { await writer.WriteLineAsync("First line of example"); await writer.WriteLineAsync("and second line"); }
StreamWriter und StreamReader sind von TextWriter bzw. TextReader abgeleitet. Die von Console.WriteLine gedruckte Zeichenfolge ist der Datenstrom/Gerät, der direkt über TextWriter in die CLR-Bibliothek geschrieben wird.
Zum Beispiel:
static void Main(string[] args) { Console.WriteLine("Call Main"); }
Console.WriteLine ruft die Funktion Out.EnsureInitialized auf. Out ist der Typ TextWriter. Der Code lautet wie folgt:
源码地址: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; } } } }
Die Funktion „EnsureInitialized“ ruft die Funktion „Volatile.Write“ auf, um den Wert von Parameter zwei in das Feld „Parameter eins“ zu schreiben. Die Erklärung hier besteht darin, den von CreateOutputWriter(ConsolePal.OpenStandardOutput()) zurückgegebenen Wert in das Feld s_out zu schreiben. s_out ist ebenfalls ein TextWriter-Typ.
Hier ist der von CreateOutputWriter(ConsolePal.OpenStandardOutput()) zurückgegebene Wert. Die CreateOutputWriter-Funktion lautet wie folgt:
源码地址: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 }); }
Sie können sehen, dass CreateOutputWriter immer noch TextWriter zurückgibt, was bedeutet, dass Volatile.Write Stream-Daten in Stream-Daten schreibt und diese dann vom Gerät ausdruckt.
Was ist der hier geschriebene Stream-Datenwert? Schauen Sie sich weiterhin die Funktion ConsolePal.OpenStandardOutput() an, die einen Stream-Typ zurückgibt.
源码地址: 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); }
Hier sind die Operationen unter Linux/Unix. Eine UnixConsoleStream-Klasse wird im Konstruktor von UnixConsoleStream instanziiert. Interop.Sys.Dup ist eine Funktion unter Linux, die Dateitabelleneintragsvorgänge ausführt. CheckIo ist eine Prüffunktion und kann hier ignoriert werden.
Im Allgemeinen erfolgt unter Linux beispielsweise das Drucken einer „Hallo Welt“ auf dem Terminal normalerweise über printf („Hallo Word“)
printf -> stdout(标准输出) -> Dup(STDOUT_FILENO) ->终端输出
Es ist ersichtlich, dass unter Linux der Parameter STDOUT_FILENO für Terminaloperationen über die Dup-Funktion übergeben wird. Der zweite Parameter von UnixConsoleStream ist FileAccess.Write, was das Schreiben einer Zeichenfolge bedeutet. Kapseln Sie dann diesen Stream und geben Sie ihn zurück, schreiben Sie ihn über Volatile.Write in den Terminal-Stream und drucken Sie ihn aus.
Dann ist es eigentlich ganz klar. Der Ablauf ist ungefähr wie folgt:
Console.WriteLine ->Out.EnsureInitialized -> ConsolePal.OpenStandardOutput() -> I
Das obige ist der detaillierte Inhalt vonPrinzip von Console.WriteLine unter .NET9 Linux-x64. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!