Frage

Ich verstehe, Zeiger und die seltene Notwendigkeit, sie in C # -Code zu verwenden. Meine Frage ist: Was ist die Argumentation hinter mit explizit in einem Codeblock „unsicher“ nennen. Zusätzlich warum muss eine Compiler-Option geändert werden „unsicher“ Code zu erlauben?

Fazit: Was in der CLR (oder Sprachdaten) macht es so können wir nicht nur Zeiger verwenden, wenn wir (ähnlich wie C und C ++) wollen, ohne „unsicher“ eingeben zu müssen und ändern Sie die Compiler-Option?

Zur Klarstellung: Ich weiß, was „unsicher“ und „sicher“ Code. Es ist nur eine Frage, warum müssen wir alle die zusätzliche Arbeit zu tun (ok, nicht so viel extra) nur in der Lage sein, diese Funktionen zu nutzen.

War es hilfreich?

Lösung

Es gibt ein Interview mit C # Creator Anders Hejlsberg, die auf das Thema berührt hier . Im Grunde genommen genau das, was @Marc Gravell sagte: Typsicherheit ersten, unsafety durch ausdrückliche Erklärung.

So Ihre Frage zu beantworten: nichts in der CLR verhindert; es ist ein Sprachidiom ermöglichen Sie mit Schutzhandschuhen zu arbeiten, wenn sie mit Typen zu tun. Wenn Sie die Handschuhe ausziehen wollen, ist es Ihre Wahl, aber Sie haben, um die aktive Wahl, die Handschuhe auszuziehen.

Edit:

  

Zur Klarstellung: Ich weiß, was   „Unsicher“ und „sicher“ Code. Es ist nur   eine Frage, warum müssen wir alles tun, das   zusätzliche Arbeit (ok, nicht so viel extra)   nur in der Lage sein, diese Funktionen zu nutzen.

Wie im Interview erwähnte ich verbunden, war es eine explizite Design-Entscheidung. C # ist im Wesentlichen eine Weiterentwicklung von Java und in Java, Sie haben keine Zeiger überhaupt. Aber die Designer wollten Zeiger ermöglichen; aber weil C # typischerweise in Java-Entwickler wäre zu bringen, hielten sie es wäre am besten, wenn der Standard Verhalten Java ähnlich sein, das heißt keine Zeiger, während immer noch die Verwendung von Zeigern durch ausdrückliche Erklärung ermöglicht.

So ist die „zusätzliche Arbeit“ vorsätzliche Sie zu zwingen, darüber nachzudenken, was Sie tun, bevor Sie es tun. Durch die explizite, es zwingt Sie zumindest betrachten: „Warum mache ich das tun I wirklich brauchen einen Zeiger, wenn ein Referenztyp genügt“

Andere Tipps

Es ist weitgehend über überprüfbar sein. Durch die Angabe unsafe sind die Handschuhe aus - das System kann nicht mehr garantieren, dass Ihr Code nicht Amok laufen. In den meisten Fällen ist es sehr wünschenswert, in der sicheren Zone zu bleiben.

Dies wird deutlicher mit teilweiser Vertrauenswürdigkeit (addins usw.), ist aber in regelmäßigem Code immer noch wertvoll.

Eigentlich macht die CLR überhaupt keine Anforderungen über ein / unsicheren Schalter oder Stichwort. In der Tat, C ++ / CLI (die C ++ Sprache, die unter der CLR läuft) hat keine solche / unsicheren Schalter und Zeiger können frei auf dem CLR verwendet werden.

Also ich Ihre Frage anders formulieren würde, wie „Warum erfordert C # die Verwendung von / unsicher vor Zeiger können verwendet werden?“ Und die Antwort auf diese Frage ist, wie auch in anderen hier gegebenen Antworten angegeben: der Benutzer zu helfen, eine bewusste Entscheidung zu treffen, die Fähigkeit zu verlieren, in etwas weniger als Voll Trust-Modus auf der CLR zu laufen. C ++ praktisch immer erfordert volle Vertrauenswürdigkeit auf der CLR und C # können , wenn Sie Code aufrufen, Volles Vertrauen erfordert, oder wenn Sie Zeiger verwenden.

Wenn Sie einen unsicheren Block verwenden, es hat den Effekt, dass der Code nicht verifizierbar. Dies erfordert bestimmte Berechtigungen auszuführen, und Sie können es nicht in Ihrer Ausgabe zulassen mögen (vor allem, wenn Sie in einer gemeinsamen Source-Umgebung sind), so gibt es einen Schalter in den Compiler es nicht zulassen.

Denken Sie darüber vom entgegengesetzten Standpunkt: weil es nicht unsicher markiert ist, können Sie daraus schließen, dass die meisten Code „sicher“ ist standardmäßig. Also, was bedeutet es „sicher“ zu sein? Für .Net Code enthält diese (aber nicht beschränkt sein):

  • Der Garbage Collector kann wie gewohnt tun.
  • Verweise auf einen bestimmten Typ wird beziehen sich auf Objekte dieses Typs (oder null).
  • -Code ist garantiert mit .Net Vertrauen / Sicherheitsanforderungen erfüllen.
  • Der Code mathematisch bewiesen nicht direkt außerhalb seiner eigenen AppDomain Speicher zu berühren. Es mag trivial erscheinen, aber vorstellen, wenn Sie mehrere AppDomains in der gleichen Anwendung. Der Programmierer kann getrost behandeln sie als logisch getrennt.

Jedes Mal, wenn Sie Zeiger verwenden haben Sie die Möglichkeit, eine dieser Garantien zu brechen. Deshalb Markierungscode als unsicher diese Schutzmechanismen gibt auf.

Kurz gesagt, .NET möchte, dass Sie Ihre Absicht erklären.

Sicher, der Compiler könnte die Notwendigkeit für den „unsicheren“ Flag schließen. Aber die Designer wollen, dass es eine bewusste Entscheidung.

Für mich, es ist verwandt mit einer Reihe von syntaktischen Anforderungen in C #:

  • keine Schaltergehäuse ohne Pause
  • no access-Ebene "Sektionen" (wie die "public:" Marker in C ++)
  • keine Klassenfelder mit "var"

Das Muster ist, dass Sie nicht eine Sache, verschieben oder ändern und eine andere unbeabsichtigt beeinflussen. Im Grunde wollen sie dich halten von „selbst in den Fuß zu schießen.“

Es gibt viele gute, informative Antworten hier - vielleicht geht dies auf Ihre Frage

.

Damit es ohne weiteres ersichtlich ist, welcher Code wird nicht ohne erhöhten Berechtigungen in Web-Services ausführen, etc.

Pflegende gute Gewohnheiten und Sicherheit. Jedes Mal, wenn Sie einen unsicheren Block in einer Baugruppe verwenden, wird eine Native Erlaubnis vom Stapel verlangt werden. Dies könnte natürlich implizit getan werden, konnte aber nicht entfernen wir auch nur mit dem Schlüsselwort private vollständig? Ich denke, es ist gut, Entwickler zu zwingen, speziell unsicheren Code zu verlangen, bevor sie es verwenden können.

Der bedeutendste Unterschied zwischen sicheren und unsicheren Code ist, dass unsicherer Code der von .net Garbage Collector nicht erreichbar ist. Automatische GC ist ein großer Teil der Mundart von .net und, wenn man über seine Grenzen hinaus gehen, können Sie eine Menge ändern, was kann über Ihren Code übernommen werden.

Pointers insbesondere für die Erstellung von Objekten auf dem Heap ohne GC Referenzen ermöglichen. Dies führt zu einem weiteren hervorragenden Grunde Code zu verlangen gekennzeichnet werden „unsicher“. Es macht es einfach, unten zu verengen, wo ein Speicherleck herkommt, wenn man bedenkt Sie eine haben.

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