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

    [C#] Regole cast tra tipi diversi, boxing / unboxing & co...

    Salve,
    eccomi di nuovo a chiedere aiuto. Stavolta il mio problema riguarda il passaggio dei dati.

    Io ho molti oggetti che si passano dati di tipo diverso, e senza una regola ben precisa (in alcune condizione un oggetto produce un double, in altre condizioni un double[], in altre ancora un oggetto da me definito, etc). Per poter passare questi dati da oggetto a oggetto ho quindi pensato di fare un cast a Object per ogni dato "in uscita" dal primo oggetto, per poi rifare il cast al tipo originale al dato "in ingresso" nel secondo oggetto. Ho solo da poco scoperto che questo procedimento è abbastanza comune, ed è detto "boxing / unboxing".
    Il problema a questo punto riguarda il come conoscere il tipo "contenuto" all'interno dell'Object. Ho stranamente notato infatti che alcune volte usando il metodo GetType() mi viene restituito il tipo corretto, altre volte mi viene restituito un generico "System.Object". Inoltre facendo il cast da Object a tipo diverso, o viceversa, alcune volte mi restituisce un "invalid cast exception", altre volte va a buon fine.

    Ora, dato che non sono ancora riuscito a capire quale sia la causa di questi comportamenti diversi da caso a caso, volevo chiedervi se sapete indicarmi una guida la più dettagliata possibile riguardante le regole di cast (quali sono le conversioni di tipo permesse e quali no), e i casi in cui funziona e quelli in cui non funziona il boxing/unboxing.

    Grazie a tutti.

    Ciao

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Io ho molti oggetti che si passano dati di tipo diverso, e senza una regola ben precisa (in alcune condizione un oggetto produce un double, in altre condizioni un double[], in altre ancora un oggetto da me definito, etc).
    Scusa ma come fai a non sapere quale tipo di oggetto ti restituisce?? E poi chi te la restituisce e in base a cosa te la restituisce?

    codice:
    Ho stranamente notato infatti che alcune volte usando il metodo GetType() mi viene restituito il tipo corretto, altre volte mi viene restituito un generico "System.Object"
    Ad esempio??

    Inoltre facendo il cast da Object a tipo diverso, o viceversa, alcune volte mi restituisce un "invalid cast exception", altre volte va a buon fine.
    Impossibile. La conversione da tipo Object a variabile può non andar a buon fine se la variabile Object non è compatibile con la variabile di destinazione, mentre la conversione opposta va sempre a buon fine (non puo dare errori) perchè a un Object gli puoi assegnare qualsiasi tipo di dato.

    Ora detto questo coverrebbe rivedere quello che hai scritto, ma in ogni caso VB.Net mette a disposizione la conversione Trycast che ritorna Nothing in caso di conversione impossibile invece che sollevare un'eccezione.

    (tradotto in C# da VB.NET)
    [CODE]
    Io ho molti oggetti che si passano dati di tipo diverso, e senza una regola ben precisa (in alcune condizione un oggetto produce un double, in altre condizioni un double[], in altre ancora un oggetto da me definito, etc).
    Scusa ma come fai a non sapere quale tipo di oggetto ti restituisce?? E poi chi te la restituisce e in base a cosa te la restituisce?

    codice:
    Ho stranamente notato infatti che alcune volte usando il metodo GetType() mi viene restituito il tipo corretto, altre volte mi viene restituito un generico "System.Object"
    Ad esempio??

    Inoltre facendo il cast da Object a tipo diverso, o viceversa, alcune volte mi restituisce un "invalid cast exception", altre volte va a buon fine.
    Impossibile. La conversione da tipo Object a variabile può non andar a buon fine se la variabile Object non è compatibile con la variabile di destinazione, mentre la conversione opposta va sempre a buon fine (non puo dare errori) perchè a un Object gli puoi assegnare qualsiasi tipo di dato.

    Ora detto questo coverrebbe rivedere quello che hai scritto, ma in ogni caso VB.Net mette a disposizione la conversione Trycast che ritorna Nothing in caso di conversione impossibile invece che sollevare un'eccezione.

    In VB.NET
    codice:
    Public Class Form1
    
        Sub CreateClass()
            Dim myPerson As New person
            Dim obj As Object = myPerson
    
            If TryCast(obj, String()) IsNot Nothing Then
                Dim stringArray As String() = CType(obj, String())
            ElseIf TryCast(obj, Integer()) IsNot Nothing Then
                Dim numericArray As Integer() = CType(obj, Integer())
            ElseIf TryCast(obj, person) IsNot Nothing Then
                Dim myobject As person = CType(obj, person)
            End If
        End Sub
    
        Public Class person
    
        End Class
    
    End Class
    (tradotto in C# da VB.NET)
    codice:
    public class Form1
    {
    _ _ public void CreateClass()
    _ _ {
    _ _ _ _ person myPerson = new person();
    _ _ _ _ object obj = myPerson;
    _ _ _ _ 
    _ _ _ _ if (obj as string[] != null) {
    _ _ _ _ _ _ string[] stringArray = (string[])obj;
    _ _ _ _ }
    _ _ _ _ else if (obj as int[] != null) {
    _ _ _ _ _ _ int[] numericArray = (int[])obj;
    _ _ _ _ }
    _ _ _ _ else if (obj as person != null) {
    _ _ _ _ _ _ person myobject = (person)obj;
    _ _ _ _ }
    _ _ }
    _ _ public class person
    _ _ {
    _ _ }
    _ _ }
    Sbagliare è umano, perseverare è diabolico.

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.