lapadula hat folgendes geschrieben : |
Hallo, habe mich ein wenig über Pointer informiert verstehe jetzt aber nicht genau wozu man diese in c# nutzen soll. |
Am Besten gar nicht
Das Arbeiten mit Pointern ist einer managed Umgebung wie .NET ein notwendiges Übel, dem man aber so weit wie möglich aus dem Weg gehen sollte. Es widerspricht den grundlegenden Ideen von .NET, dass man eben nicht mehr direkt auf Speicherbereiche zugreift. Insbesondere wenn man auf Funktionen der Windows API zugreifen muss, kommt man nicht drum herum, ansonsten sind die Anwendungsszenarien aber begrenzt.
Man kann, wenn man mit Pointern und generell mit unsafe-Codebereichen arbeitet, vielleicht ein wenig Performance herausholen, aber meist steht der Gewinn an Performance auf der einen und der Verlust an Lesbarkeit und Sicherheit auf der anderen Seite in keinem sinnvollen Verhältnis. Wessen Anwendung es erfordert, auf diesem Level an der Performance zu schrauben, sollte eher erwägen, direkt auf native Sprachen wie C, C++ oder Delphi zu setzen.
Mit diesen Warnungen vorweg, kannst Du Dir ein Beispiel, welches in den Bereich der Windows-API-Aufrufe fällt bei uns in den Open-Source-Projekten angucken, wo
Frühlingsrolle in seinem Projekt
frDriveNET einiges mit IntPtr anstellt.
Wenn Du wirklich an anderer Stelle Pointer verwenden möchtest, sähe ein Beispiel so aus:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| int[] allTheBestNumbers = new int[42];
fixed(int* pAllTheBestNumbers = allTheBestNumbers) { pAllTheBestNumbers[44] = 42; }
MessageBox.Show(allTheBestNumbers[44].ToString()); |
Wichtig: der Code funktioniert nur, wenn (a) das Projekt mit /unsafe compiliert wird und (b) die Methode, in der der Code steht, mit
unsafe deklariert wird. Man sieht, dass die Hürden hier extra hoch gehängt werden.
Der Code zeigt, dass durch die Verwendung von Pointern z.B. die Range Checks von .NET ausgehebelt werden und ich auf das 45. Element eines 42 Elemente langen Arrays zugreifen kann. Das spart Zeit (weil keine Checks ausgeführt werden), kann aber auch dazu führen, dass man in Speicherbereiche schreibt, wo man nicht hin will.
Die Range Checks greifen dann wieder in der letzten Zeile, wo ich direkt auf das Array zugreife.
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".