Frage

Wir haben einen ähnlichen Code die folgenden in einem unserer Projekte. Kann mir jemand erklären (in einfachem Englisch), warum die feste Aussage hier gebraucht wird?

class TestClass
{
    int iMyVariable;
    static void Main()
    {
        TestClass oTestClass = new TestClass();
        unsafe
        {
            fixed (int* p = &oTestClasst.iMyVariable)
            {
                *p = 9;
            }
        }
    }
}
War es hilfreich?

Lösung

Es legt den Zeiger im Speicher. Müll gesammelt Sprachen haben die Freiheit, für Effizienz Objekte um Speicher zu bewegen. Das ist alles für den Programmierer transparent, weil sie nicht wirklich verwenden Zeiger in „normalen“ CLR-Code. Wenn Sie jedoch Hinweise benötigen, dann müssen Sie es im Speicher beheben, wenn Sie mit ihnen arbeiten wollen.

Andere Tipps

Die wird "pin" die variablen im Speicher, so daß der Speicherbereinigungs bewegt es nicht um, wenn das Sammeln. Wenn es die Variable tat bewegen, würde der Zeiger nutzlos und wenn man es verwendet, Sie würden versuchen, etwas zu greifen oder zu ändern, die Sie nicht wollen.

Sie müssen es überall Sie Pointer-Arithmetik tun, um die Garbage Collector zu verhindern, dass es um dich zu bewegen.

Da Sie im unsicheren Modus (Zeiger) ausgeführt wird, weist die feste Anweisung einen bestimmten Speicherplatz auf diese Variable. Wenn Sie nicht die feste Anweisung gesetzt haben, die Garbage Collector die Variable überall im Speicher bewegen kann, wenn er will.

Hoffe diese Hilfe.

MSDN hat ein sehr ähnliches Beispiel. Die feste Anweisung grundsätzlich blockiert garbage collection. In .NET, wenn Sie einen Zeiger auf einen Speicherplatz verwenden kann die Laufzeit um das Objekt zu einer „besseren“ Lage jederzeit umverteilt. SO, wenn Sie Speicher zugreifen möchten direkt müssen Sie es an Ort und Stelle fixieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top