Ich lese gerade die ECMA-334 wie von einem Freund vorgeschlagen, die Programmierung für einen Lebensunterhalt macht. Ich bin auf dem Abschnitt mit unsicheren Code beschäftigt. Obwohl ich etwas verwirrt bin über das, worüber sie sprechen.Understanding Unsafe Code und seine Verwendungen
Der dem C# zugrunde liegende Garbage Collector funktioniert möglicherweise, indem Objekte im Speicher verschoben werden, aber diese Bewegung ist für die meisten C# -Entwickler unsichtbar. Für Entwickler, die im Allgemeinen mit automatischem Speicher Management zufrieden sind, aber manchmal feinkörnige Kontrolle oder das zusätzliche Bit der Leistung benötigen, bietet C# die Möglichkeit, "unsicheren" Code zu schreiben. Solch ein Code kann direkt mit Zeigertypen und Objektadressen umgehen; C# erfordert jedoch, dass der Programmierer Objekte temporär repariert verhindert, dass der Garbage Collector sie bewegt. Diese "unsichere" Code Funktion ist in der Tat eine "sichere" Funktion aus der Perspektive der beiden Entwickler und Benutzer . Unsicherer Code muss deutlich im Code mit dem Modifikator unsafe gekennzeichnet sein, so dass Entwickler möglicherweise nicht unsichere Sprachfunktionen versehentlich verwenden können, und der Compiler und die Ausführung zusammenarbeiten, um sicherzustellen, dass unsichere Code nicht maskieren kann als sicherer Code. Diese Einschränkungen beschränken die Verwendung von unsicheren Codes auf Situationen, in denen der Code vertrauenswürdig ist.
Das Beispiel
using System;
class Test
{
static void WriteLocations(byte[] arr)
{
unsafe
{
fixed (byte* pArray = arr)
{
byte* pElem = pArray;
for (int i = 0; i < arr.Length; i++)
{
byte value = *pElem;
Console.WriteLine("arr[{0}] at 0x{1:X} is {2}",
i, (uint)pElem, value);
pElem++;
}
}
}
}
static void Main()
{
byte[] arr = new byte[] { 1, 2, 3, 4, 5 };
WriteLocations(arr);
Console.ReadLine();
}
}
zeigt ein unsicheres Block in einem Verfahren namens WriteLocations, die eine Array-Instanz Behebungen und Zeigermanipulation verwendet über die Elemente iterieren. Der Index, der Wert und die Position jedes Array-Elements werden in die Konsole geschrieben. Ein mögliches Beispiel Ausgabe lautet:
arr[0] at 0x8E0360 is 1 arr[1] at 0x8E0361 is 2 arr[2] at 0x8E0362 is 3 arr[3] at 0x8E0363 is 4 arr[4] at 0x8E0364 is 5
aber natürlich die genauen Speicherplätze können in verschiedenen Ausführungen der Anwendung unterschiedlich sein.
Warum ist es für uns als Entwickler von Vorteil, die genauen Speicherpositionen zu kennen? Und könnte jemand dieses Ideal in einem vereinfachten Kontext erklären?
Es ist fast immer nicht, und Sie sollten Ihr Bestes tun, um es zu vermeiden. –
Auch das Fixieren von Objekten und das Ermitteln ihres Standorts ist manchmal für Interop notwendig, aber normalerweise brauchen Sie keinen unsicheren Code dafür –
Wenn Sie diese Frage stellen müssen, brauchen Sie wahrscheinlich keinen unsicheren Code;). Unsicherer Code kann schneller sein und Sie können auf Speicher zugreifen, der von nicht verwaltetem Code verwendet wird. –