Frage

Ich bin etwas verwirrt darüber, dass in C# nur die Referenztypen durch Garbage Collection erfasst werden.Das bedeutet, dass GC nur die Referenztypen für die Speicherfreigabe auswählt.Was passiert also mit den Werttypen, da sie auch Speicher auf dem Stapel belegen?

War es hilfreich?

Lösung

Ob sie sich auf dem Stapel oder Teil des Heaps befinden, hängt zunächst davon ab, zu welchem ​​Kontext sie gehören. Wenn sie sich innerhalb eines Referenztyps befinden, befinden sie sich sowieso auf dem Heap.(Sie sollten sowieso darüber nachdenken, wie sehr Ihnen die Stapel-/Heap-Trennung wirklich am Herzen liegt – wie Eric Lippert geschrieben hat, ist es so weitgehend ein Implementierungsdetail.)

Grundsätzlich wird jedoch der Werttypspeicher zurückgewonnen, wenn der Kontext zurückgefordert wird. Wenn also der Stapel durch die Rückkehr von einer Methode geöffnet wird, wird der gesamte Stapelrahmen „zurückgefordert“.Wenn der Werttyp value tatsächlich Teil eines Objekts ist, wird der Speicher ebenfalls zurückgewonnen, wenn dieses Objekt durch Garbage Collection erfasst wird.

Die kurze Antwort ist, dass Sie sich darüber keine Sorgen machen müssen :) (Dies setzt voraus, dass Sie nichts haben andere als den Speicher, um den man sich natürlich Sorgen machen muss – wenn Sie Strukturen mit Verweisen auf native Handles haben, die freigegeben werden müssen, ist das ein etwas anderes Szenario.)

Andere Tipps

Ich bin ein bisschen verwirrt darüber, dass in C# nur die Referenztypen Müll gesammelt werden.

Dies ist keine Tatsache. Oder vielmehr hängt die Wahrheit oder Falschheit dieser Aussage davon ab, was Sie unter "Müll gesammelt" meinen. Der Müllsammler untersucht sicherlich Werttypen beim Sammeln. Diese Werttypen könnten am Leben sein und sich an einem Referenztyp festhalten:

struct S { public string str; }
...
S s = default(S); // local variable of value type
s.str = M(); 

Wenn der Müllsammler läuft, betrachtet er sich sicherlich, weil er feststellen muss, dass S.SR noch lebt.

Mein Vorschlag: Klären Sie klar genau Was du mit dem Verb meinst "wird Müll gesammelt".

GC wählt nur die Referenztypen für die Speicherentwicklung aus.

Auch dies ist keine Tatsache. Angenommen, Sie haben eine Instanz von

class C { int x; }

Das Gedächtnis für die Ganzzahl befindet sich auf dem garbage-gesammelten Haufen und wird daher vom Müllsammler zurückgefordert, wenn die Instanz von C nicht verwurzelt wird.

Warum glauben Sie, dass nur die Erinnerung an Referenztypen vom Müllsammler ausgearbeitet wird? Die richtige Aussage ist das Gedächtnis, das war zugewiesen vom Müllsammler ist verarbeitet durch den Müllsammler, was meiner Meinung nach vollkommen sinnvoll ist. Der GC hat es zugewiesen, damit es für die Aufräumung verantwortlich ist.

Was passiert also mit den Werttypen, da sie auch den Speicher auf Stack belegen?

Mit ihnen passiert überhaupt nichts. Mit ihnen muss nichts passieren. Der Stapel ist eine Million Bytes. Die Größe des Stapels wird bestimmt, wenn der Faden startet. Es beginnt bei einer Million Bytes und bleibt während der gesamten Ausführung des Threads eine Million Bytes. Das Gedächtnis auf dem Stapel wird weder erstellt noch zerstört; Nur der Inhalt wird geändert.

In dieser Frage werden zu viele Verben verwendet, wie zerstört, zurückgefordert, verkauft, entfernt. Das entspricht nicht gut mit dem, was tatsächlich passiert. Eine lokale Variable hört einfach auf, zu sein, Norwegischer Papageistil.

Eine Methode hat einen einzelnen Eintrittspunkt, als erstes kommt es, dass der CPU -Stapelzeiger eingestellt ist. Erstellen eines "Stack -Rahmens", Speicherplatz für die lokalen Variablen. Der CLR garantiert, dass dieser Raum auf 0 initialisiert wird, nicht ansonsten eine Funktion, die Sie aufgrund der bestimmten Zuordnungsregel stark in C# verwenden.

Eine Methode verfügt return Aussagen. Zu diesem Zeitpunkt wird der Stapelzeiger einfach zu seinem ursprünglichen Wert wiederhergestellt. In der Tat "vergisst", dass die lokalen Variablen wo immer dort. Ihre Werte werden in keiner Weise "geschrubbt", die Bytes sind noch da. Aber sie werden nicht lange dauern, der nächste Anruf in Ihrem Programm wird sie wieder überschreiben. Die CLR Zero-Initialisierungsregel stellt sicher, dass Sie diese alten Werte niemals beobachten können, das wäre unsicher.

Sehr, sehr schnell, dauert nicht mehr als einen einzelnen Prozessorzyklus. Ein sichtbarer Nebeneffekt dieses Verhaltens in der C#-Sprache ist, dass Werttypen keinen Finalizer haben können. Sicherstellen, dass keine zusätzliche Arbeit erledigt werden muss.

Ein Werttyp am Stapel wird aus dem Stapel entfernt, wenn er aus dem Spielraum ausgeht.

Lassen Sie mich zunächst sagen, dass dies sehr machbar ist, aber nicht ohne einen erheblichen Anstrengungsaufwand ist, sowohl beim Nachdenken durch das richtige Design als auch bei der Umsetzung. Es gibt hier keinen schnellen Fix, um zu sagen, dass hier Ihre Optionen sind.

Was Sie im Wesentlichen ansehen müssen, sind Augmented-Ansprüche, dh Sie brauchen einen Weg, um den Satz von Ansprüchen zu erweitern, dass SharePoint für Ihre authentifizierten Benutzer bekannt ist. Mit SharePoint können Sie Gegenstände gegen Ansprüche sichern.

Sie können die Augmentation der Ansprüche auf verschiedene Arten, aber die beiden häufigsten sind:

ADFS - Sie haben darauf bereits angedeutet, aber wenn ADFs als benutzerdefinierter Identitätsanbieter für Ihre Anwendung verwendet wird, können Sie ADFS-Antragsregeln und Attributspeicher verwenden, um die SQL-Datenbank abzufragen und neue Ansprüche zuzuordnen an Ihren Benutzer. Sie müssen dann nur SharePoint mit diesen neuen Ansprüchen sichern. Wenn Sie dieser Route folgen, lesen Sie grundsätzlich alles, was Steve Peschka jemals auf dem Thema veröffentlicht hat, beginnend mit diesem:

http://blogs.technet.com/b/speschka/archive/2010/07/30/configuring-sharepoint-2010-und-adfs-v2-end-no-end.aspx

Um weitere Informationen zur Verwendung eines SQL-Attribut-Shops in ADFs zu finden, um die Ansprüche zu erweitern, schauen Sie sich dies an:

http://blogs.technet.com/b/vinitt/archive/2013/04/15/wow-to-use-to-custom-sql- Attribut-Store-to-generate-claims-and-autorize-user.aspx

custom container-Anbieter - Sie können einen benutzerdefinierten Antragsteller für SharePoint schreiben und sich gegen Ihre Webanwendung registrieren. Sie müssen den gesamten Code auf die Abfrage der Datenbank schreiben und die zurückgegebenen Werte abrufen, Ich gehe davon aus, dass dies kein Problem ist. Diese Option gibt Ihnen eigentlich mehr Kontrolle über die Benutzererfahrung, um SharePoint zu sichern, da die ADFs selbst nicht möglich, dass Sie keine Validierungs- oder Suchaspekte in den Antragsteller (People Picker) integrieren können. Tatsächlich schlimmer als dass es erscheinen wird, dass jeder Wert, den er im People-Picker gesucht hat, gilt, ob er als gültiger Attributwert vorhanden ist oder nicht, ist dies für den menschlichen Fehler sehr offen, wenn Sie Gegenstände in SharePoint sicherstellen, damit Sie einen Hybrid in Betracht ziehen möchten Ansatz, der ADFs zur Augmentation von Ansprüchen verwendet, hat jedoch einen benutzerdefinierten Antragsteller, um den Namen von Namen von Ihrer SQL-Datenbank zu suchen und aufzulösen.

Weitere Informationen und ein Ausgangspunkt für benutzerdefinierte Anbieter finden Sie hier:

http://msdn.microsoft. com / en-us / library / gg615945% 28V= office.14% 29.aspx

Allerdings hat Steve Peseschka wieder viele Blog-Beiträge zu diesem Thema geschrieben, und ich empfehle, einen Blick durch alle von ihnen zu werfen, während Sie ein Design aufbauen.

Dies ist nur ein Kick-Start in die richtige Richtung, und zweifellos haben Sie mehr Fragen, bevor Sie alle Antworten erhalten, die Sie brauchen.

hoffe das hilft.

Werttypen werden verhandelt, wenn der Stapelrahmen nach seiner Ausführung entfernt wird, würde ich annehmen

Ich möchte auch hinzufügen, dass der Stack auf einer Thread -Ebene und Heap auf Anwendungsdomänenebene liegt.

Wenn ein Thread endet, würde der Stapelgedächtnis, der von diesem speziellen Thread verwendet wird, zurückgeführt.

Jede Wertstypinstanz in .NET ist Teil von etwas anderem, was eine größere Einschließungstypinstanz, ein Heap -Objekt oder ein Stapelrahmen sein könnte. Immer wenn eines dieser Dinge entsteht, werden auch Strukturen in ihnen entstehen; Diese Strukturen werden dann weiter existieren, solange das, was sie enthält. Wenn die Struktur nicht mehr existiert, wird auch die Struktur existieren. Es gibt keine Möglichkeit, eine Struktur zu zerstören, ohne den Behälter zu zerstören, und es gibt keine Möglichkeit, etwas zu zerstören, das eine oder mehrere Strukturen enthält, ohne die darin enthaltenen Strukturen zu zerstören.

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