Freigeben über


Sicherer und unsicherer Code (C# und Java im Vergleich)

Aktualisiert: November 2007

Ein besonders interessantes Feature von C# ist die Unterstützung von nicht-typsicherem Code. Normalerweise wird die Überwachung des Microsoft Intermediate Language(MSIL)-Codes von der Common Language Runtime (CLR) übernommen, die alle fragwürdigen Operationen verhindert. Unter gewissen Umständen ist es jedoch erforderlich, direkt auf Low-level-Funktionen, z. B. Win32-API-Aufrufe, zuzugreifen. Sie haben zwar die Berechtigung hierfür, tragen aber auch die Verantwortung dafür, dass der Code fehlerfrei funktioniert. Solchen Code müssen Sie in unsafe-Blöcke im Quellcode einfügen.

Das unsafe-Schlüsselwort

C#-Code für Aufrufe der low-level-API, die Verwendung von Zeigerarithmetik oder andere fragwürdige Operationen muss in Blöcken stehen, die mit dem unsafe-Schlüsselwort markiert sind. Als unsicher markiert werden können:

  • Eine ganze Methode.

  • Ein Codeblock in geschweiften Klammern.

  • Eine einzelne Anweisung.

Im folgenden Beispiel wird die Verwendung von unsafe in allen drei der oben erwähnten Situationen veranschaulicht:

class TestUnsafe
{
    unsafe static void PointyMethod()
    {
        int i=10;

        int *p = &i;
        System.Console.WriteLine("*p = " + *p);
        System.Console.WriteLine("Address of p = {0:X2}\n", (int)p);
    }

    static void StillPointy()
    {
        int i=10;

        unsafe
        {
            int *p = &i;
            System.Console.WriteLine("*p = " + *p);
            System.Console.WriteLine("Address of p = {0:X2}\n", (int)p);
        }
    }

    static void Main()
    {
        PointyMethod();
        StillPointy();
    }
}

In diesem Codebeispiel wird die gesamte PointyMethod()-Methode als unsicher markiert, da die Methode Zeiger deklariert und verwendet. Die StillPointy()-Methode markiert einen Codeblock als unsicher, da dieser Block ebenfalls Zeiger verwendet.

Das fixed-Schlüsselwort

In sicherem Code kann der Garbage Collector Objekte während Ihrer Lebensdauer frei verschieben, um freie Ressourcen zu organisieren und zusammenzufassen. Wenn in Ihrem Code dagegen Zeiger verwendet werden, kann dieses Verhalten leicht zu unerwarteten Ergebnissen führen. Um dies zu verhindern, können Sie mithilfe der fixed-Anweisung den Garbage Collector anweisen, bestimmte Objekte nicht zu verschieben.

Im folgenden Codebeispiel sorgt das fixed-Schlüsselwort dafür, dass ein Array bei der Ausführung eines Codeblocks in der PointyMethod()-Methode nicht vom System verschoben wird. Beachten Sie, dass fixed nur innerhalb von unsicherem Code verwendet wird:

class TestFixed
{
    public static void PointyMethod(char[] array)
    {
        unsafe
        {
            fixed (char *p = array)
            {
                for (int i=0; i<array.Length; i++)
                {
                    System.Console.Write(*(p+i));
                }
            }
        }
    }

    static void Main()
    {
        char[] array = { 'H', 'e', 'l', 'l', 'o' };
        PointyMethod(array);
    }
}

Siehe auch

Aufgaben

Beispiel für unsicheren Code

Konzepte

C#-Programmierhandbuch

Referenz

Unsicherer Code und Zeiger (C#-Programmierhandbuch)

Weitere Ressourcen

Die Programmiersprache C# für Java-Entwickler