Condividi tramite

in VBA, All Uscita del loro ambito, le variabili oggetto vengono SEMPRE settate su NOTHING?

Anonimo
2018-02-12T22:53:22+00:00

Salve a chiunque passi da queste parti.

La domanda è apparentemente stupida ma sono alla ricerca di una risposta definitiva.

In rete e su molteplici libri di testo, ho notato moltissimi listati che terminano le proprie procedure con una sfilza di:

Sub NomeSub()

Dim VariabileOggetto As object

'

'Istruziini varie

'

Set VariabileOggetto = Nothing

End su

Io ho sempre saputo che, all uscita delle procedure e, in generale, fuori dall ambito in cui sono utilizzate, le variabilioggetto, perdono il proprio riferimento all oggetto che rappresentano. Settate a notjing insomma.

Ho letto la guida in linea di Excel per sincerarmene e mi pareva, dopo aver letto del tempo di vita delle variabili e delle variabili_oggetto, di aver trovato risposta.

Poi, però, mi sono imbattuto nella voce Nothing ed ho notato che l ultima frase è AMBIGUA perchè parla si, di settaggio a nothing esplicito ed implicito ma pur pensando che si sian sbagliati a scrivere sembra che voglian dire che le variabiliOggetto,  se non settate a Nothing prima dell uscita dalla procedura, se non settate a nothing, rimangono settate con il loro riferimento.

Mi dareste una mano, per piacere, a comprendere quanto scritto nella guida in linea di excel riguardo alla voce NOTHING?

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2018-02-13T17:18:44+00:00

Grazie della tempestiva risposta ma devo obbiettare su dove si è andati a battere con essa.

Anche se il motivo che mi porta a pormi questa domanda deriva proprio da questa abitudine di chi implementa in VBA, il mio quesito riguarda qualcosa che avviene prima del CG.

A me interessa sapere se, una variabile_oggetto, uscita dal proprio ambito, viene settata automaticamente a Nothing.

Ripetendo in modo differente la stessa cosa:

la variabile_Oggetto, che porta con se il puntamento all' oggetto di cui è riferimento, una volta uscita dalla procedura, o, più in generale, uscita dal proprio ambito, viene, dal runtime (se così si chiama) settata a Nothing?

Io credo che la risposta possa essere solo di due tipi:

  1. Si. Sempre
  2. No. Mai

Poi, quello che succede DOPO, in questo topic non vorrei affrontarlo perché credo che i fraintendimenti, avvengano anche per questo motivo, perché si mette più carne al fuoco di quello di cui ci sia bisogno.

Mi sarei accontentato della guida in linea e credo anche quanto in essa c'è scritto sia sufficiente ma leggendola una secponda volt ami sono reso conto che  sia la traduzione in italiano che l' originale inglese mancano di qualcosa . Nel senso che l' autorre di quello scritto, deve aver pensato qualcosa ma poi non lo ha scritto.

Oppure, quello che ha voluto scrivere non lo ha saputo fare in modo corretto.

Cito la guida in linea di Microsoft Office alla voce NOTHING (chiedo scusa se non l' ho fatto in topic ma esso è stato scritto da cellulare)


NOTHING

La parola chiave Nothing è utilizzata per annullare l'associazione tra una variabile oggetto e qualsiasi oggetto. Per assegnare Nothing a una variabile oggetto, utilizzare l'istruzione Set. Ad esempio:

Set MyObject = Nothing

È possible che diverse variabili oggetto facciano riferimento allo stesso oggetto. Quando si assegna la parola chiave Nothing a una variabile oggetto, tale variabile non si riferirà più ad alcun oggetto. Quando più variabili oggetto si riferiscono a uno stesso oggetto, la memoria e le risorse di sistema associate all'oggetto al quale si riferiscono le variabili saranno rilasciate solo dopo che tutte le variabili oggetto saranno state impostate su Nothing, in modo esplicito utilizzando Set, oppure in modo implicito dopo che l'ultima variabile oggetto impostata su Nothing non rientra più nell'area di validità.


con particolare attenzione all' ultima parte:


oppure in modo IMPLICITO  dopo che l'ultima variabile oggetto IMPOSTATA su Nothing non rientra più nell'area di validità.


La prima cosa che ho capito è stata che:

Per non avere più nessun riferimento all' oggetto che sottostà alla variabile_oggetto o alle molteplici variabili_oggetto, ho due possibilità:

  1. Settarle personalmente, quindi esplicitamente, a nothing attraverso l' utilizzo di SET, una normale assegnazione insomma.
  2. Oppure, lasciarle uscire dall' ambito di validità di modo che fosse il sistema a tagliare i ponti con l' oggetto. Di fatto, usciti dalla validità,  la varabile_oggetto viene settata a Nothing o, magari, del tutto eliminata.

Credo non sia una cosa stupida credere che:

o avviene SEMPRE 

o non avviene MAI

Perchè non sono le variabili_oggetto, i lmotivo di malfunzionamenti (ricollegandomi alla solita tiritera sul CG che non fa bene il suo mestiere), ma gli oggetti stessi che non sono, forse, stati implementati in modo corretto e quindi mancano di un processo per essere "disposti", come un metodo Dispose o un metoto Quit, per esempio, oppure, l' implementatore, ha dimenticato di utilizzarli nelle sedi opportune del programma.

a titolo di completezza anche se non riesco a dirti dove l' ho letto nele varie ricerche sulla guida (alla voce "Vita utile delle variabili" non lo leggo)... comunque, la guida in linea specifica, anche che per rilasciare gli oggetti utilizzati, non esiste un metodo comune ma va identificato attraverso la documentazione di quel dato oggetto.

....

Mi rendo conto che ho sforato fuori dall' argomento anche io.  Effetivamente, però, ho avuto bisogno di aggiungere qualcosina anche oltre al mio quesito per poter, spero, riuscire a spiegarmi il meglio che posso.

Grazie ancora delal gentile attenzione.

Ora sono di corsa ma andrò a leggere i link che mi hai consigliato non appena mi libero dagli impegni che ho (credo  gia domani)

La risposta è stata utile?

0 commenti Nessun commento

1 risposta aggiuntiva

Ordina per: Più utili
  1. Anonimo
    2018-02-13T00:50:40+00:00

    Ciao Dracoscrigno_quello_VERO,

    La domanda è apparentemente stupida ma sono alla ricerca di una risposta definitiva.

    In rete e su molteplici libri di testo, ho notato moltissimi listati che terminano le proprie procedure con una sfilza di:

    Sub NomeSub()

    Dim VariabileOggetto As object

    '

    'Istruziini varie

    '

    Set VariabileOggetto = Nothing

    End su

    Io ho sempre saputo che, all uscita delle procedure e, in generale, fuori dall ambito in cui sono utilizzate, le variabilioggetto, perdono il proprio riferimento all oggetto che rappresentano. Settate a notjing insomma.

    Ho letto la guida in linea di Excel per sincerarmene e mi pareva, dopo aver letto del tempo di vita delle variabili e delle variabili_oggetto, di aver trovato risposta.

    Poi, però, mi sono imbattuto nella voce Nothing ed ho notato che l ultima frase è AMBIGUA perchè parla si, di settaggio a nothing esplicito ed implicito ma pur pensando che si sian sbagliati a scrivere sembra che voglian dire che le variabiliOggetto,  se non settate a Nothing prima dell uscita dalla procedura, se non settate a nothing, rimangono settate con il loro riferimento.

    Mi dareste una mano, per piacere, a comprendere quanto scritto nella guida in linea di excel riguardo alla voce NOTHING?

    Hai posto una domanda che è suscettibile di una risposta breve ed ad un livello semplicistico oppure che può costituire l'argomento di un intero capitolo d'un libro erudito sulla programmazione VB(A)!

    Ad un livello semplice, tutti gli oggetti locali disponibili, creati e di proprietà dell'istanza corrente di Excel, verranno automaticamente distrutti dal garbage collector VBA al termine della procedura o delle procedure pertinenti o, meglio, quando la variabile vanno fuori scope (ambito). Pertanto, non è necessario esplicitamente destruggere tali variabili oggetto con un'instruzione del tipo:

         Set aWorkbook = Nothing

    Detto questo, nelle precedenti versioni di VBA, l'efficienza del VBA Garbage Collector è stata occasionalmente segnalata come inefficiente. Tuttavia, io non sono mai stato in grado di replicare questo comportamento e ho il sospetto che qualsiasi problema fosse dovuto a un fraintendimento della portata delle variabili.

    Personalmente, non ho mai distrutto esplicitamente le variabili locali al termine di una procedura con un'eccezione importante: distruggerò sempre in modo esplicito qualsiasi variabile oggetto che si riferisce a librerie esterne e, pertanto, non appartiene all'istanza corrente di Excel.

    Quindi se ho istanziato una variabile oggetto in questo modo:

         Set oWordApp = CreateObject ("Word.Application")

    destruggerò sempre esplicitamente la varible alla conclusione della procedura pertinente con l'istruzione:

     Set oWordApp = Nothing

    Se desideri vedere molti esempi del mio uso della distruzione esplicita di variabili, prova a fare una ricerca negli archivi del forum usando le parole chiave Noman and Nothing.

    Per una discussione più approfondita, vedi )in inglese= le risposte di Nigel Heffernan e Siddharth Rout nel seguente thread:

              VBA Reference counting - Object destruction

    Se desideri ulteriori riferimenti dettagliati sull'argomento, li posterò volontieri.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento