Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [VB6 - VB.Net] Domanda su For Each e Set di variabile a Nothing

    salve a tutti,

    avrei una domanda da fare a voi esperti di VB6 e VB.Net.

    Premetto che è 5 anni che programmo in VB.Net e VB6 e quindi penso di sapere almeno un pò sugli ambiti delle variabili..

    Stamattina dopo una mail da parte mia che spiegava che per un uso di un For Each per iterare una collezione di oggetti non era necessario mettere la variabile usata per il for each a Nothing se non viene usato anche prima di tale iterazione mi sono sentito rispondere così:

    "Questo è quanto c’era nell’esempio Microsoft e tu non hai imparato che è cosa buona mettere tutti gli oggetti a nothing prima di uscire da una sub !!! E questo non lo dico io, la Microsfot e tutti quelli che programmano con VB."

    io tutto arrabbiato ho risposto alla mail nel seguente modo:

    "Forse non è chiaro il concetto di iterazione di oggetti a te... concordo con te che un oggetto va sempre messo a nothing però se viene fatta l'iterazione a oggetti il nothing è inutile in quanto il programma di suo mette l'oggetto a nothing quando arriva al next e poi lo risetta quando torna al for...

    se una variabile viene settata e usata da un programmatore senza un for each è palese, invece, che debba essere messa a nothing sennò potrebbe rimanere incastrata in memoria.

    concludo dicendoti che la Microsoft fà esempi alla cazzo di cane, solo per far capire all'utente di turno come viene fatta una certa cosa (infatti se vai a vedere a fondo pagina c'è scrito che l'esempio è a puro scopo dimostrativo e che loro non si assumono responsabilità circa danni arrecati da esso), non soffermandosi su stili di programmazioni particolari a meno che questi non siano l'obbiettivo finale del codice stesso, e non soffermandosi altresi su un'aspetto molto importante che è l'uso della memoria, specialmente riguardo ai pc che abbiamo noi che spesso e volentieri sono in fase di Swap dalla mattina alla sera.."

    Sò di essere stato un pò duro, ma quando si lede la mia professione di programmatore dandomi dell'incapace e dell'incompetente divento una furia e non mi interessa se ho di fronte il primo sconosciuto o il dio in terra...

    a sto punto chiedo a voi di far luce su questo argomento.

    Grazie

  2. #2
    implementazione alla risposta mandatami ora. lui scrive:

    "Guarda che queste cose non c’è bisogno che tu me le spieghi. Ho solo 20 anni più di te di programmazione !!

    Anzi ti dirò di più. In teoria uscendo dalla sub non avresti neppure bisogno di settare a nothing gli oggetti perché tutti quelli dichiarati all’inizio della Sub dovrebbero essere distrutti con la “End Sub “. Ma se la Microsoft, la Sue (Mosher) e tutti gli altri ti dicono di fare così forse è perché in qualche caso questo no succede e potrebbe portarti all’overflow del programma o peggio ancora del sistema."

    e infine:

    "Concludendo, ti ho dato un programmino stupido ma veloce che ti aiuta a fare quello che stai facendo.

    Devi Usarlo, implementandolo con quello che ti serve (vedi Userproperties che non vengono creati nello schema.ini da ADOX ).

    Non impartire lezioni inutili non richieste. Ringrazia e basta"

    insomma devo solo chinare la testa, rispondere sempre si (come gli asini) e fregarmene se per fare quello che deve fare il programma ci mette 10 minuti invece di 20 secondi...

    bha...

  3. #3
    A parte lo sfogo ...
    la domanda è MOLTO intrigante e quindi la risposta non può essere che interessante!

    Io dico la mia.

    Impostando una variabile a Nothing non è come dire "pulisci la memoria utilizzata", ma bensì "sgancia al variabile da quella parte della memoria". In poche parole elimina il link che dalla variabile porta al primo bit della porzione di memoria occupata dall'oggetto (così è un po' semplificato ma concettualmente ci siamo).
    Per pulire la memoria c'è il i dispose che fa terra bruciata.

    Una volta che la memoria allocata supera una certa soglia (prima di arrivare allo swap) windows (e credo tutti i SO) esegue funzioni per trovare bit "vaganti" ( = non riferiti ad un processo attivo), a quel punto li sovrascrive. Il fatto di impostare tutti gli oggetti a Nothing alla fine di una funzione è importante perchè capita che anche processi teoricamente finiti risultino latenti come provessi sttivi (soprattutto precessi in thread).

    Per quanto riguarda l'iterazione "for each programmatore in HTML.it"...
    arrivato al Next il puntatore che collega la variabile "programmatore" all'oggetto "Vendaval" viene sostituito con uno che punta all'oggetto "Andrea.Medici". In realtà il passaggio per Nothing non ha uno scopo, comunque il primo puntatore non esiste più!!!


    Insomma, credo tu abbia ragione...
    sono stato un po' prolisso per spiegare la motivazione della risposta finale.
    Mi piacerebbe aver conferme o altri pareri perchè sono un fan dell'associazione "salviamo la memoria di sistema"

    Ciao

  4. #4
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    Allora un po' di chiarezza che qui si sta facendo molta confusione..

    si parla di vb.net o vb6? perchè sono due linguaggi COMPLETAMENTE diversi..

    il fatto che la sintassi sia simile non centra nulla..

    il .net in generale opera una politica particolare (come il java per riassumere) alle variabili (che si chiamano riferimenti)

    in poche parole una variabile esiste (come in tutti i linguaggi oop in generale) all'interno del suo scope, quindi in un ciclo esiste solo nel ciclo e un una sub esiste solo nella sub stessa..

    detto questo, all'uscita ad esempio da una sub, la variabile non esiste.. quindi il riferimento non c'è più.. l'oggetto, che ha riferimenti = 0, sarà preda del garbage collector che lo distruggerà..

    la dispose, basta vedere l'implementazione negli oggetti net del framework, non fa altro che fare da "distruttore" fittizio.. in pratica marca come distruggibile l'oggetto e fa lo stesso con i sottoggetti contenuti.. Quindi non distrugge effettivamente nulla (quindi quello che dice Vendaval non è del tutto vero)..

    l'unica incognita è il tempo del garbage collector che non si azione subito ma quando serve (in teoria)..

    in un ciclo di migliaia di iterazioni la costruzione di migliaia di oggetti magari pesanti senza un = nothing o un dispose può (in rari casi) portare al riempimento della memoria virtuale (ma è veramente una caso difficile).

    Ciò cmq va a prescindere dall'ignoranza del tipo che risponde alla mail che fa la vode grossa dicendo "se lo dice la microsoft sarà vero" senza studiarsi il perchè..

  5. #5
    se a qualcuno interessa, la mia domanda era dovuta a 4 errori che ho trovato in questa sub VB6 passatami dal mio boss:

    codice:
    Sub Schema(ByVal ExOut As String, ByVal Liv As Integer)
        Dim Cn As ADODB.Connection
        Dim Cat As ADOX.Catalog
        Dim Tbl As ADOX.Table
        Dim Col As ADOX.Column
        On Error Resume Next
        Set Cn = New ADODB.Connection
        Set Cat = New ADOX.Catalog
        Set Col = New ADOX.Column
        Set Tbl = New ADOX.Table
        Cn.Provider = "Microsoft.JET.OLEDB.4.0"
        Cn.ConnectionString = "Exchange 4.0;MAPILEVEL= " & ExOut & ";PROFILE=Outlook;" & "TABLETYPE=0;DATABASE=C:\WINDOWS\TEMP\;"
        Cn.Open
        If Cn.State = 1 Then
            Set Cat.ActiveConnection = Cn
     '       If Cat.State = 1 Then
            For Each Tbl In Cat.Tables
                Debug.Print String(Liv * 2, " ") & Tbl.Name
                DoEvents
        ' l'oggetto 'Col' è quello che crea lo schema della cartella
                For Each Col In Tbl.Columns
                    Err.Clear
                Next
                If Tbl.Name <> "Outlook 10 Security Settings" Then
                    Call Schema(ExOut & Tbl.Name & "\", Liv + 1)
                End If
            Next
        End If
        Set Cn = Nothing
        Set Cat = Nothing
        Set Col = Nothing
        Set Tbl = Nothing
    End Sub
    a parte il fatto che creare col New una variabile non ha senso se poi non la usi (se non nel For Each) e di conseguenza non vedo la necessità di mettere a Nothing le due variabili alla fine.

    Altri errori potrebbero essere: (correggetemi se sbaglio)
    1) connessione non chiusa... potrebbe rimanere aperte infinite connessioni tra server e client usando tale codice;
    2) se la connessione non riesce a essere aperta viene generato un errore di cui lui non si è manco preoccupato di cancellare.

    se ne trovate altri di errori o se mi son sbagliato io ditemelo

    Concludendo: Guardare sto codice mi fà dire che io non sarò il programmatore migliore del mondo, ma almeno certi errori di logica e di programmazione non li farei mai... Alla faccia dei 20 anni di programmazione alle spalle...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.