using und GC Problem??



  • folgender code:

    m_Dat = new MemoryStream(dat.Length+ sizeof(int) + sizeof(short));
    
                using(BinaryWriter bw= new BinaryWriter(m_Dat)){
                   bw.Write(iTypeId);     //TYPE
                   bw.Write(iPriority);   //Priority
                   bw.Write((short)233);  //CRC
                   bw.Write(dat);         //Data
                }
    
                m_Dat.Position = 0;
    

    das BinaryWriter Object brauch ich nur um in den Memory Stream zu schreiben, hat auch funktioniert.. verwende ich allerding "using" bei dem BinaryWirter object.. gibt es eine "ObjectdisposeExceptiin bei "m_Dat.Postion=0"?? warum.. er löscht doch nur das "bw", nicht aber "m_Dat"??? oder hab ich was nich verstanden ....??



  • Doch, sobald du die using-Direktiven verwendest, wird GARANTIERT dass das Objekt auf jedenfall nach dem Using Block abgeräumt/diposed wird.



  • d.h. es wird auch das "m_Dat" Object aufgeräumt? ich benötige das "bw" object ja nur um in den MemoryStream zu schreiben.. aber der wird ja anscheinend auch gelöscht.. das versteh ich net



  • Richtig, sobald der Block verlassen wird, wird das was mit using eingeleitet wurde disposed.Aber was mich auch verwundert, warum er auch ein dispose über das MemoryStream objekt drüber jagt? 😕



  • genau das wundert mich... was er mit dem MemoryStream anstellt...??



  • Hmm Moment, du übergibst ja deinem BinaryWriter das Streamobjekt. Jetzt ist es sicherlich so, das bei dem Dispose vom binaryWriter, wirklich alles disposed wird, auch das was du ihm übergeben hast. Erinnert mich an eine Komposition. "Wenn das eine nicht mehr Existiert, kann das andere auch nicht mehr exisitieren" (oder so ähnlich) 😃



  • ja aber bei ne komposition ist eig. gängig das das Objekt auch im Agregater erzeugt wird.. und auch wieder gelöscht wird... glaub ich;)

    Aber das wäre ja bullshit wenn es in dem fall hier so wäre...würde keinen sinn machen das BinaryWirter den MemoryStream löscht



  • BorisDieKlinge schrieb:

    Aber das wäre ja bullshit wenn es in dem fall hier so wäre...würde keinen sinn machen das BinaryWirter den MemoryStream löscht

    Egal ob es "Sinn macht" oder nicht, der BinaryWriter tut es einfach und fertig, da gibt es nicht viel zu diskutieren.



  • Ok Herr Lehrer... die Tatsache akzeptieren ohne die Hintergründe zu wissen, is noch so mein ding^^



  • O.o schrieb:

    BorisDieKlinge schrieb:

    Aber das wäre ja bullshit wenn es in dem fall hier so wäre...würde keinen sinn machen das BinaryWirter den MemoryStream löscht

    Egal ob es "Sinn macht" oder nicht, der BinaryWriter tut es einfach und fertig, da gibt es nicht viel zu diskutieren.

    Völlig unqualifizierter Beitrag, entweder du begründest es oder lässt so ein Schwachsinn, weil einfach daher kommen und sinnlosen Mist in den Raum rotzen zeigt nicht gerade einen hohen Intelligenzquotienten.



  • Firefighter schrieb:

    zeigt nicht gerade einen hohen Intelligenzquotient.

    einen quotienten



  • volkard schrieb:

    Firefighter schrieb:
    zeigt nicht gerade einen hohen Intelligenzquotient.

    einen quotienten

    Liegt am Dialekt.



  • volkard -.- du weißt was ich meine, und ich denke das du es acuh so siehst, wenn man schon wie mein vorposter, sowas postet, sollte man es wenigstens begründen können oder nicht ;)?

    @ boris 😃 man da wollte ich dich mal verteidigen 😛 und dann sowas:D schäme dich 😃



  • Schließt die aktuelle BinaryWriter-Klasse und den zugrunde liegenden Stream.

    Gibt die von der BinaryWriter-Klasse verwendeten nicht verwalteten Ressourcen und optional auch die verwalteten Ressourcen frei.

    War gar nicht schwer das in der MSDN zu finden. Hätte bestimmt auch Boris geschafft



  • Du musst das Schließen des dem BinaryWriter zugrunde liegenden Streams verhindern, indem du dir nen Proxystream bastelst, also etwa so...

    public class MyMemoryStream : MemoryStream {
    
        public MyMemoryStream( int capacity )
             : base( capacity ) {
        }
    
        public override void Close() {
          Flush();
        }
      }
    

    Statt MemoryStream verwendest du nun MyMemoryStream.

    PS: Wenn man Englisch kann, bringt Google auf der ersten Seite einen Hit zu der Thematik (suche nach: c# binarywriter dispose).

    PPS: Wenn man nicht Englisch kann, sollte man als Programmierer Englisch lernen. Je eher, desto besser. 😉


Anmelden zum Antworten