Heim > Computer-Tutorials > Computerwissen > Prinzip von Console.WriteLine unter .NET9 Linux-x64

Prinzip von Console.WriteLine unter .NET9 Linux-x64

WBOY
Freigeben: 2024-02-23 09:04:10
nach vorne
698 Leute haben es durchsucht

.NET9 Linux-x64下Console.WriteLine原理

1. Vorwort

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

2. Verwalteter Code

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");
}
Nach dem Login kopieren

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");
}
Nach dem Login kopieren

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;
}
}
}
}
Nach dem Login kopieren

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
});
}
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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) ->终端输出
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:mryunwei.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage