Was ist der Vorteil der Verwendung von unsicherem und sicherem C # -Code?

8
%Vor%

VS

%Vor%     
InfoLearner 22.03.2011, 23:38
quelle

5 Antworten

10

Sicherer Code kann in jeder Situation ausgeführt werden, in der Sie C # -Code ausführen können (Silverlight, Shared Hosting ASP.NET, XNA, SQL Server usw.), während unsicherer Code erhöhte Vertrauenswürdigkeit erfordert. Dies bedeutet, dass Sie Ihren Code an mehreren Orten und mit weniger Einschränkungen ausführen können.

Außerdem ist es sicher, das heißt, Sie müssen sich keine Sorgen machen, etwas falsch zu machen und Ihren Prozess zum Absturz zu bringen.

    
Gabe 22.03.2011, 23:41
quelle
7

Ihr Beispiel ist nicht gut, der JIT-Compiler erzeugt den Code bereits so. Unter der Haube sind Referenzen auch Hinweise. Dies musste schnell sein, und verwalteter Code wäre niemals konkurrenzfähig gewesen.

Der Garbage-Collected-Heap ist ziemlich inkompatibel zu Zeigern. Sie müssen Objekte anheften, um einen Zeiger auf sie erstellen zu können. Ohne das Pinning könnte der Garbage Collector das Objekt verschieben und der Code wird nach dem Zufallsprinzip nicht ausgeführt, wodurch die Heapintegrität zerstört wird. Pinning kostet nicht null, sowohl bei der Operation als auch beim Effizienzverlust, den Sie erleiden werden, nachdem Sie die Fixierung aufgehoben haben, wenn eine Speicherbereinigung stattfindet, während ein Objekt angeheftet wird.

Zeiger sind sehr effektiv beim Zugriff auf nicht verwalteten Speicher. Das kanonische Beispiel ist die Bildverarbeitung, die den Zugriff auf die Pixel einer Bitmap erfordert. Und es ist eine Möglichkeit, schnell auf gepinnte Arrays zuzugreifen, bei denen alle Sicherheitsverriegelungen entfernt wurden. Die Überprüfung des Array-Index ist nicht kostenlos, wenn sie nicht iteriert werden.

    
Hans Passant 23.03.2011 00:03
quelle
5

Es gibt nur einen Grund, unsicheren Code zu verwenden: Raw-Leistung.

Wenn Sie unsicheren Code verwenden, können Sie C ++ - ähnliche Zeiger verwenden, ohne die Laufzeitumgebung zu überprüfen. Keine Kontrolle bedeutet, dass Sie alleine sind, aber es gibt weniger Overhead.

Ich habe es nur in Aktion gesehen, um die Bild- / Bitmap-Manipulation zu beschleunigen. Aber Sie könnten es auch für Inline-String-Manipulation verwenden (ja, machen Strings veränderbar !!! Schlechte Idee sowieso, wenn Sie StringBuilder erstellen wollen). Andere Verwendungen umfassen Matrixberechnungen oder andere schwere Mathematik. Und wahrscheinlich Schnittstellen mit dem Betriebssystem und etwas Hacking.

    
GvS 22.03.2011 23:45
quelle
2

Ein perfektes Beispiel ist in Buch J. Richter "CLR via C #", 3. Ausgabe, Kap. 16: Der folgende C # -Code zeigt drei Techniken (sicher, gezackt und unsicher) für den Zugriff auf ein zweidimensionales Array:

%Vor%

Die Methode Unsafe2DimArrayAccess ist mit dem unsicheren Modifizierer gekennzeichnet, der erforderlich ist die fixe Anweisung von C # verwenden. Um diesen Code zu kompilieren, müssen Sie beim Aufruf des C # -Compilers die Option / unsafe angeben oder das Kontrollkästchen "Unsafe Code zulassen" auf der Registerkarte "Erstellen" des Bereichs "Projekteigenschaften" in Microsoft Visual Studio aktivieren. Wenn ich dieses Programm auf meinem Rechner starte, bekomme ich folgende Ausgabe:

%Vor%

Wie Sie sehen können, ist die sichere zweidimensionale Array-Zugriffstechnik die langsamste. Die sichere gezackte Array-Zugriffstechnik benötigt etwas weniger Zeit als die sichere zweidimensionale Array-Zugriffstechnik. Sie sollten jedoch beachten, dass das Erstellen des gezackten Arrays zeitraubender ist als das Erstellen des mehrdimensionalen Arrays, da das Erstellen des gezackten Arrays erfordert, dass für jede Dimension ein Objekt auf dem Heap zugewiesen wird, wodurch der Garbage Collector regelmäßig ausgelöst wird. Es gibt also einen Kompromiss: Wenn Sie viele "multidimensionale Arrays" erstellen müssen und nur selten auf die Elemente zugreifen möchten, ist es schneller, ein mehrdimensionales Array zu erstellen. Wenn Sie das "multidimensionale Array" nur einmal erstellen müssen und Sie häufig auf seine Elemente zugreifen, erhalten Sie mit einem gezackten Array eine bessere Leistung. In den meisten Fällen ist das letztere Szenario häufiger.

    
Roman Melnyk 17.02.2012 12:48
quelle
1

Ich glaube nicht, dass die Verwendung von unsicheren Code in dem von Ihnen angegebenen Beispiel von Vorteil ist. Ich habe wirklich nur unsicheren Code verwendet, wenn ich mit nicht verwaltetem Code interagieren musste, z. B. wenn ich zu Nicht-COM-DLL-Schnittstellen aufrief.

    
forsvarir 22.03.2011 23:43
quelle

Tags und Links