Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
22/07/11 19:19
Qwertj
Salve a tutti,
Non mi riesco assolutamente a spiegare una cosa:
Nel mio programma chiamo una funzione che accetta due parametri ByVal, glieli passo entrambi. Uno di questi è una lista, quando gliela passo però viene passata invece che come ByVal, come ByRef, e viene modificata. Nonostante sia una proprietà ReadOnly :om:
Il codice è circa questo
'Funzione chiamata
Private Function DoSomething(ByVal List1 As List(Of String), ByVal List2 As List(Of String)) As String
Dim Result As String
List1.RemoveRange(0, List2.Count)
For Each Element As String In List1
  Result &= Element
Next
Return Result
End Function

'metodo "principale"
Public Sub DoSomethingElse(ByVal List2 As List(Of String))
Dim AnObject As New AClass("example")
'questo stampa, ad esempio, 7
MessageBox.Show(AnObject.ReadOnlyList.Count)
MessageBox.Show(DoSomething(AnObject.ReadOnlyList, List2))
'questo stampa invece 0 quando List2.Count = AnObject.ReadOnlyList.Count
MessageBox.Show(AnObject.ReadOnlyList.Count)
End Sub

Ha un senso?:-|
aaa
22/07/11 19:27
BionicGod
Che ne dici di postare tutto il sorgente...
Non so cosa sia AClass, non ho il suo funzionamento, come faccio ad aiutarti?
POSTA TUTTO...
aaa
22/07/11 20:08
Qwertj
Il problema non sta sicuramente in AClass, ma piuttosto nel codice che ti ho postato

Comunque, se vuoi anche quelli te li do, ma dubito che possano aiutarti
Class AClass
Public Sub New(ByVal Value As String)
     For Each Letter As Char in Value
          _ReadOnlyList.Add(Letter.ToString)
     Next
End Sub

Private _ReadOnlyList As New List(Of String)
Public ReadOnly Property ReadOnlyList As List(Of String)
     Return _ReadOnlyList
End Property
End Class
Ultima modifica effettuata da Qwertj 22/07/11 20:10
aaa
22/07/11 20:37
BionicGod
    Public Sub DoSomethingElse(ByVal List2 As List(Of String))
        Dim AnObject As New AClass("example")
        Console.WriteLine(AnObject.ReadOnlyList.Count)
        Dim e As New List(Of String)
        For Each Letter As Char In AnObject.ReadOnlyList
            e.Add(Letter.ToString)
        Next
        Console.WriteLine(DoSomething(e, List2))
        Console.WriteLine(AnObject.ReadOnlyList.Count)
    End Sub

La soluzione sarebbe creare un'altra lista così da non alterare il numero di valori in ReadOnlyList
Rimane comunque anomala la modifica nonostante sia ReadOnly.
Non so che dirti...
aaa
22/07/11 20:47
Qwertj
Infatti... è davvero strano :yup:
aaa
22/07/11 23:59
HeDo

Se tu sapessi vagamente come funziona il linguaggio che stai usando, avresti ben chiaro il motivo per cui le liste (ed in generale tutti gli oggetti) vengono passati ByRef. Inoltre, se avessi studiato la differenza tra oggetti mutabili ed immutabili, sapresti immediatamente come risolvere questo "problema" che in realtà è il comportamento normale del codice.





aaa
23/07/11 7:09
BionicGod
Premetto che io non studio VB.NET, ma C#...però non ho mai sentito parlare di oggetti mutabili e immutabili. Siceramente nel libro di programmazione non ci sono riferimenti a questi termini. Potresti gentilmente spiegarci come funzionano?
aaa
23/07/11 7:27
Qwertj
In effetti hai ragione HeDo, mi ero scordato che gli oggetti reference sono passati per referenza 8-| Chiedo umilmente perdono :hail:
Però come risolvo? Che sono gli oggetti mutabili/immutabili?
Avevo provato anche a fare una cosa così:
Dim Copy As List(Of String) = List1.Take(List1.Count).ToList

Anche una cosa del genere passa a Copy una referenza di List1?
aaa