C # Unsicherer / fester Code
Kann mir jemand ein Beispiel geben, eine gute Zeit, um tatsächlich "unsicher" und "fixed" im C# - code? Ich habe gespielt mit ihm vor, aber nie wirklich eine gute Verwendung für Sie.
Betrachten Sie diesen code...
fixed (byte* pSrc = src, pDst = dst) {
//Code that copies the bytes in a loop
}
im Vergleich zu einfach mit...
Array.Copy(source, target, source.Length);
Das zweite ist der code, der sich in der .NET Framework, die zunächst einen Teil des Codes kopiert von der Microsoft-website, http://msdn.microsoft.com/en-us/library/28k1s2k6(VS.80).aspx.
Den eingebauten Array.Kopie() ist um ein Vielfaches schneller als die Verwendung von Unsicherem code. Dies könnte nur weil der zweite ist einfach besser geschrieben und der erste ist nur ein Beispiel, aber welche Arten von Situationen würden Sie wirklich auch brauchen, um die Verwendung von Unsicheren/Fixed code für alles? Oder ist diesen Armen web-Entwickler messing mit etwas über seinem Kopf?
InformationsquelleAutor der Frage | 2008-09-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nützlich für interop mit nicht verwaltetem code. Alle Zeiger übergeben an nicht verwaltete Funktionen, die repariert werden müssen (aka. angeheftete) um zu verhindern, dass der garbage collector die Verlagerung der zugrunde liegenden Speicher.
Wenn Sie mit P/Invoke, dann ist die Standard-marshaller wird pin-Objekte für Sie. Manchmal ist es notwendig, zum ausführen von benutzerdefinierten marshalling, und manchmal ist es notwendig die pin ein Objekt länger als die Dauer eines einzelnen P/Invoke-Aufruf.
InformationsquelleAutor der Antwort Brannon
Ich verwendet habe, unsafe-Blöcke zu manipulieren, um Bitmap-Daten. Raw-pointer-Zugriff ist deutlich schneller als SetPixel/GetPixel.
"fest" und "unsicher" ist in der Regel verwendet, wenn dabei interop, oder wenn zusätzliche Leistung erforderlich ist. Dh. String.CopyTo () - Methode verwendet, unsicheren und festen in der Umsetzung.
InformationsquelleAutor der Antwort Rune
reinterpret_cast-Stil Verhalten
Wenn Sie etwas zu manipulieren, dann kann unglaublich nützlich sein
viele high-performance Implementierungen von hashcode verwenden, UInt32, damit der hash-Wert (das macht die Verschiebungen einfacher). Da .Net erfordert Int32 für die Methode, die Sie schnell konvertieren möchten, uint, int. Da spielt es keine Rolle, was der tatsächliche Wert ist nur, dass alle bits in dem Wert sind bewahrt geblieben, interpretieren die Besetzung ist erwünscht.
beachten Sie, dass die Namensgebung orientiert sich an der BitConverter.DoubleToInt64Bits
Weiterbildung in der hashing-Vene, Umwandlung einer stack-basierten struct in ein byte - * erlaubt die einfache Nutzung von pro-byte-Hash-Funktionen:
unsicher auch (ab 2.0 aufwärts) können Sie stackalloc. Dies kann sehr nützlich in der high-performance-Situationen, in denen einige kleine, variable Länge array wie temporäre Speicherplatz benötigt wird.
Alle diese Verwendungen wären fest in der 'nur, wenn Ihre Anwendung braucht wirklich die Leistung" und somit ungeeignet sind im Allgemeinen Gebrauch, aber manchmal Sie wirklich brauchen.
behoben ist notwendig, wenn Sie möchten interop mit einigen nützlich nicht verwalteten Funktion aus (es gibt viele), nimmt die c-style-arrays oder strings. Als solches ist es nicht nur aus performance-Gründen aber Richtigkeit, wenn in interop-Szenarien.
InformationsquelleAutor der Antwort ShuggyCoUk
Unsicher ist nützlich für (zum Beispiel), erste pixel-Daten aus einem Bild schnell mit LockBits. Die performance-Verbesserung über das mit der managed API ist mehrere Größenordnungen.
InformationsquelleAutor der Antwort Nick
Mussten wir die Verwendung eines festen, wenn eine Adresse übergeben bekommt auf eine ältere C-DLL. Da die DLL verwaltet einen internen Zeiger über Funktionsaufrufe, die Hölle würde losbrechen, wenn die GC komprimiert den heap und zog Zeug herum.
InformationsquelleAutor der Antwort Nick
Ich glaube, dass unsicherer code wird verwendet, wenn Sie zugreifen möchten, die etwas außerhalb der .NET runtime ie. es ist nicht verwaltetem code (keine garbage collection und so weiter). Dies beinhaltet die raw-Aufrufe der Windows-API und all that jazz.
InformationsquelleAutor der Antwort Matt Wilkinson
Dieser erklärt mir, dass die Designer des .NET framework hat einen guten job der Deckung, das problem Raum-machen Sie sicher, dass die "managed code" - Umgebung kann alles tun, eine traditionelle (z.B. C++) - Ansatz kann mit seiner unsicheren code/Zeiger. In Fall ist es nicht, das unsichere/fixed features sind da, wenn Sie Sie brauchen. Ich bin sicher, jemand hat ein Beispiel, wo unsicherer code ist notwendig, aber es scheint in der Praxis selten sind-das ist eher der Punkt, nicht wahr? 🙂
InformationsquelleAutor der Antwort Patrick Szalapski