Pagina 3 di 3 primaprima 1 2 3
Visualizzazione dei risultati da 21 a 26 su 26
  1. #21
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,485
    Originariamente inviato da raffaeu
    Nuovamente non concordo, perchè resto dell' idea di usare un ByRef per poter controllare lo stato
    Cosa significa "controllare lo stato"?

    Originariamente inviato da raffaeu
    inoltre, a casa mia, la copia di un oggetto occupa comunque piu' risorse.
    Vero. Ma in questo caso, contrariamente a quanto dici, non viene effettuata la copia di un oggetto, l'oggetto è sempre solo uno, la connessione è sempre e solo una.

    Originariamente inviato da raffaeu
    Infine nell' ultima frase, hai perso parecchi punti; primo perchè ognuno puo' proporre una soluzione valida, e la mia non lo era meno della tua; secondo se non hai davanti un Compilatore, quel che leggi devi anche saperlo tradurre (non alla lettera).
    Non capisco quale sia il tuo problema.
    Chiunque può proporre una soluzione valida, chi ha mai detto il contrario.

    E' altrettanto vero che chiunque può confutarla, ad ogni modo, e proporre soluzioni differenti, in primo luogo, ma soprattutto correggere errori se ritiene che vi siano.

    Originariamente inviato da raffaeu
    Infine vorrei renderti nota la differenza tra moderare e imporre.
    "Moderare" e "imporre" non c'entrano nulla e non sono in alcun modo attinenti alla discussione.

    Hai fatto un'affermazione: che con ByVal (o ByRef, non è più nemmeno chiaro) si crea un nuovo oggetto Connection, e questo non mi risulta corrispondere al vero.

    Tutto ciò che non c'entra nulla con questo argomento, come le lezioni di lingua italiana, sono irrilevanti e non mi interessa discuterne.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  2. #22
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,485
    Originariamente inviato da Kahm
    eddai raga'
    continuate per strada oppure in privato
    Dato che ho scritto solamente cose tecniche, non vedo perché dovrei comunicarle in privato visto che fanno parte della discussione.

    Originariamente inviato da Kahm
    cmq mi date una segnalazione come deve essere associata la connessione se la passo come parametro?
    Ho risposto anche alla tua domanda, fra le altre cose.
    Quale delle informazioni che ti ho dato non ha risposto alla tua domanda?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #23
    Utente di HTML.it L'avatar di biste
    Registrato dal
    Apr 2001
    Messaggi
    877
    Assolutamente d'accordo con alka per quanto riguarda la discussione tecnica
    UGIdotNET
    Microsoft .NET MCAD
    C++, C#, VB6, VB.NET, ASP, ASP.NET
    SQL Server 2000

  4. #24
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,584
    il dubbio mi è rimasto semplicemnete nella variabile di connessione della classe
    sapere visto che con l'istruzione conn=myconn è stata associata ad una connessione, sapere se dopo la devo ciudere in quanto ora è una connessione aperta

    oppure come diceva alka, visto che passanddo con byref prende il riferimento della conessione dichiarata nel form non c'è bisogno di chiuderla

    grazie
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  5. #25
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,485
    Originariamente inviato da Kahm
    il dubbio mi è rimasto semplicemnete nella variabile di connessione della classe
    sapere visto che con l'istruzione conn=myconn è stata associata ad una connessione, sapere se dopo la devo ciudere in quanto ora è una connessione aperta
    oppure come diceva alka, visto che passanddo con byref prende il riferimento della conessione dichiarata nel form non c'è bisogno di chiuderla
    La Connection è un oggetto, che crei con New, quindi a meno di non ripetere la stessa operazione, la connessione con cui lavori, quindi l'oggetto che la rappresenta, è sempre uno.

    Ciò che copi in un campo, o passi per parametro, è il riferimento a quell'oggetto, ma non è l'oggetto: non hai più connessioni, ne hai una, tant'è che se chiudi la connessione nella seconda classe del tuo esempio, lo sarà anche per quella superiore, poiché stai lavorando con riferimenti che "puntano" tutti ad un unico e solo oggetto Connection, che verrà distrutto automaticamente quando tutti questi riferimenti saranno usciti dal loro "scope".

    Ovviamente, trattandosi di una risorsa delicata, conviene non aspettare che il GC rilasci l'oggetto chiudendo la connessione, provvedendo manualmente a questa operazione.

    In generale, quindi, l'apertura della connessione la esegui tu quando chiami Open, e la chiudi con Close, a meno che qualche DataReader non lo faccia autonomamente (verifica lo stato della connessione prima di chiuderla, eventualmente).

    Considerando che la connessione viene creata esternamente alla classe che ne fa uso per l'elaborazione, credo sia formalmente corretto inserire allo stesso livello anche la chiusura.

    Per spiegare il concetto usando un semplice esempio (non verificato), partendo dal tuo:
    codice:
    Dim conn As New OleDbConnection
    conn.ConnectionString = "..."
    conn.Open
    Try
      Dim obj As New Life(conn)
      obj.DoSomething()
      ' Eventuali altri utilizzi della connessione ai dati...
    Finally
      If conn.State = ConnectionState.Open Then
        conn.Close
      End If
    End Try
    
    
    
    
    Private internalConn As OleDbConnection
    
    Sub New(aConn As OleDbConnection)
      MyBase.New()
      internalConn = aConn
    End Sub
    
    Public Sub DoSomething()
      Dim MyCommand As OleDbCommand
      MyCommand = New OleDbCommand(internalConn, SQL)
      ' ...
    End Sub
    In alternativa, invece di passare il riferimento alla connessione nel costruttore, puoi passarlo direttamente al metodo DoSomething.

    Non penso ti serva molto altro, se lo scopo è passare il riferimento alla connessione ad un oggetto, o a più oggetti, di una classe differente, o di altre classi, affinché venga utilizzata da questi per una o più interrogazioni al DB, decentrando la logica dell'elaborazione in sè, ma centralizzando invece l'operazione di apertura della connessione.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #26
    Piccola lezione di byval e di byref per raffaeu
    Prova ad eseguire questo codice:
    codice:
    Public Class Test
        Public CampoEsempio As Integer
        Public ReadOnly Name As String 'Campo immutabile
        Public Sub New(ByVal nName As String)
            Name = nName
            Console.WriteLine("Costruzione di " & Me.ToString())
        End Sub
        Public Overrides Function ToString() As String
            Return "{Name=" & Name & ";CampoEsempio=" & CampoEsempio.ToString() & "}"
        End Function
        Protected Overrides Sub Finalize()
            Console.WriteLine("Distruzione di " & Me.ToString())
        End Sub
    End Class
    
    Public Module Principale
        Public tst As New Test("Test creato in Main")
        Public Sub Main()
            tst.CampoEsempio = 0
            EsempioByVal1(tst)
            Console.WriteLine(tst)
            EsempioByRef1(tst)
            Console.WriteLine(tst)
            EsempioByVal2(tst)
            Console.WriteLine(tst)
            EsempioByRef2(tst)
            Console.WriteLine(tst)
            EsempioByVal3(tst)
            EsempioByRef3(tst)
        End Sub
    
        Public Sub EsempioByVal1(ByVal parametro As Test)
            Console.WriteLine("In EsempioByVal1")
            parametro.CampoEsempio += 5
        End Sub
    
        Public Sub EsempioByRef1(ByRef parametro As Test)
            Console.WriteLine("In EsempioByRef1")
            parametro.CampoEsempio += 5
        End Sub
        Public Sub EsempioByVal2(ByVal parametro As Test)
            Console.WriteLine("In EsempioByVal2")
            Dim zzz As New Test("Test creato in EsempioByVal2")
            parametro = zzz
        End Sub
        Public Sub EsempioByRef2(ByRef parametro As Test)
            Console.WriteLine("In EsempioByRef2")
            Dim zzz As New Test("Test creato in EsempioByRef2")
            parametro = zzz
        End Sub
        Public Sub EsempioByVal3(ByVal parametro As Test)
            Console.WriteLine(parametro Is tst)
        End Sub
        Public Sub EsempioByRef3(ByRef parametro As Test)
            Console.WriteLine(parametro Is tst)
        End Sub
    End Module
    Eseguendo questo programma verrà visualizzato:
    codice:
    Costruzione di {Name=Test creato in Main;CampoEsempio=0}
    In EsempioByVal1
    {Name=Test creato in Main;CampoEsempio=5}
    In EsempioByRef1
    {Name=Test creato in Main;CampoEsempio=10}
    In EsempioByVal2
    Costruzione di {Name=Test creato in EsempioByVal2;CampoEsempio=0}
    {Name=Test creato in Main;CampoEsempio=10}
    In EsempioByRef2
    Costruzione di {Name=Test creato in EsempioByRef2;CampoEsempio=0}
    {Name=Test creato in EsempioByRef2;CampoEsempio=0}
    True
    True
    Distruzione di {Name=Test creato in EsempioByRef2;CampoEsempio=0}
    Distruzione di {Name=Test creato in Main;CampoEsempio=10}
    Distruzione di {Name=Test creato in EsempioByVal2;CampoEsempio=0}
    Esaminiamo le prime 5 righe: si può notare che indipendentemente da come venga passato, le modifiche effettuate ai campi dell'oggetto (anche indirettamente attraverso metodi dell'oggetto stesso) si riflettono anche sulla variabile pubblica tst, poiché sia la variabile tst sia i parametri passati alle funzioni sono SEMPRE E COMUNQUE DEI PUNTATORI che puntano al medesimo oggetto in memoria; il byval e il byref si riferiscono al puntatore, non all'oggetto: se si passa un oggetto byref verrà passato un puntatore al puntatore passato alla funzione, per cui la funzione EsempioByRef1 dovrà andare a guardare in "parametro", in cui troverà un puntatore a "tst", che a sua volta è un puntatore all'oggetto vero e proprio che si trova in memoria. Passando invece l'oggetto per valore, "parametro" in EsempioByVal1 conterrà un puntatore nuovo che punta direttamente all'oggetto. In entrambi i casi ovviamente la funzione può accedere e modificare i campi del medesimo oggetto.
    Le sei righe successive e le procedure EsempioByVal2 e EsempioByRef2 servono ad evidenziare le conseguenze della differenza tra ByVal e ByRef riferita a ReferenceTypes: osservando il corpo delle due funzioni si può notare che entrambe creano un nuovo oggetto (identificato da un nome diverso) e tentano di assegnarlo al parametro passato. Come si può vedere dall'output in entrambe le funzioni si verifica la costruzione, ma, mentre con il passaggio ByVal la modifica non si riflette sul puntatore tst, con il passaggio ByRef al puntatore tst viene assegnato l'oggetto creato in EsempioByRef2, poiché mentre a EsempioByVal2 viene passato un nuovo puntatore all'oggetto che anche se viene modificato non influenza nulla, a EsempioByRef2 viene passato un puntatore al puntatore tst, e quindi la funzione può modificare anche la destinazione del puntatore tst, come fa qui.
    Le due righe successive dimostrano che sia con il passaggio byval sia con il passaggio byref si hanno dei puntatori (o delle catene di puntatori) ad un medesimo oggetto (in questo caso tst), di cui non viene creata alcuna copia: l'operatore Is, contenuto nelle sub EsempioByVal3 ed EsempioByRef3, restituisce true se i due puntatori puntano al medesimo oggetto, e restituisce true sia con il passaggio byval sia con quello byref.
    Per tirare le somme, ByVal parametro As Test è come dire in C "Test ** parametro", mentre ByRef parametro As Test equivale a "Test * parametro".
    IMPORTANTE: esiste sì un caso in cui il runtime .NET crea copie di interi oggetti, e non di puntatori: è quello che fa quando si passa ByVal un oggetto che eredita da ValueType, come una struttura (Structure) o un tipo di dato "primitivo", come Integer, Long, ... (System.Int32, System.Int64, ...).
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.