Passare un array di struct come parametro

giovedì 13 settembre 2007 - 18.45

Gemini Profilo | Expert

Ciao a tutti,
come posso passare come parametro un array di tipo struct ad una funzione definita in un altre classe? Devo definire la struct sia nella classe chiamante e sia nella classe chiamata?

Ho trovato una soluzione, che funziona, ma non so se è proprio corretta.
Ho definito una classe e l'ho chiamata, per esempio, clsTipoClienti:

public class clsTipoCliente { public string codice_cliente; public string codice_user; public clsTipoCliente() { codice_cliente = string.Empty; codice_user = string.Empty; } }


Nella classe Cliente definisco:
clsTipoClienti[] aClienti = new clsTipoClienti[2]; //Inizializzo l'array di classi for (int i=0;i<2;i++) aClienti[i] = new clsTipoClienti(); //richiamo la funzione DatBanker.getClienti(ref aClienti); in clsDataBanker definisco: public void getClienti(ref clsTipoClienti[] aClienti)


In questo modo non devo ripetere la struct nella classe chiamante e nella classe chiamata quando devo passare un parametro composto. Ma non sono sicuro che sia una soluzione pulita.
Grazie mille!

adima80 Profilo | Junior Member

>Ciao a tutti,
>come posso passare come parametro un array di tipo struct ad
>una funzione definita in un altre classe? Devo definire la struct
>sia nella classe chiamante e sia nella classe chiamata?
>
>Ho trovato una soluzione, che funziona, ma non so se è proprio
>corretta.
>Ho definito una classe e l'ho chiamata, per esempio, clsTipoClienti:
>
>
>public class clsTipoCliente
>{
> public string codice_cliente;
> public string codice_user;
>
> public clsTipoCliente()
> {
> codice_cliente = string.Empty;
> codice_user = string.Empty;
> }
>}

Così hai appena dichiarato una classe, che in c# è di tipo reference. Per dichiarare una struttura devi usare Struct, le strutture in c# sono di tipo value Type.


>//richiamo la funzione
>DatBanker.getClienti(ref aClienti);

Non è necessario utilizzare ref, le classi sono di tipo reference type, e quindi vengono automaticamente passate per riferimento.



>In questo modo non devo ripetere la struct nella classe chiamante

Perchè avresti dovuto ripetere la struct???

Il codice che hai scritto funziona comunque, spero di esserti stato di aiuto e spero di non aver detto troppe str****** , ciao!

Gemini Profilo | Expert

Grazie per l'aiuto.
Il mio dubbio è questo:
Quando vado a definire nella classe la funzione, devo definire il tipo del parametro:
public void Esempio(strClienti[] Clienti)

non mi darà errore perchè strClienti è definita nella classe chiamante?

Non so se è possbile definire la struttura da qualche parte in modo che sia visibile in tutta l'applicazione.
Ancora grazie

adima80 Profilo | Junior Member

>Grazie per l'aiuto.
>Il mio dubbio è questo:
>Quando vado a definire nella classe la funzione, devo definire
>il tipo del parametro:
>public void Esempio(strClienti[] Clienti)
>
>non mi darà errore perchè strClienti è definita nella classe
>chiamante?

Dipende, mi spiego. Se la classe che contiene il metodo Esempio è nello stesso namespace oppure ,in caso di Assembly, se hai referenziato l'assembly no.

guarda:
[code]
namespace Test
{
classe Prova
{
public string a = "";
public string b = "";
}

classe Prova
{
public void Main()
{
Prova nuova_prova = new Prova();
nuova_prova.a = "cane";
nuova_prova.a = "gatto";

Esempio(nuova_prova);
}

private void Esempio(Prova prova)
{
Cosole.WriteLine(prova.a);
}
}

}

[endcode]

Così il codice funziona, funziona anche in caso usi un array di classi come nel tuo caso.

Ciao!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5