PDA

View Full Version : [C#]il costruttore di Thread...(Domanda per un Guru di OO e C#)


eve
08-10-2006, 11:11
non riesco a capire come mai un thread può essere costruito con il nome del metodo !
dalla documentazione di visual studio leggo che un Thread può essere costruito in 4 modi ma nessuno di questi costruttori corrisponde a un costruttore con un parametro di tipo metodo....però c'è un costruttore che prende un delegato :D
allora ho pensato: beh..prende un metodo, crea un istanza anonima del delegato e tutto funziona !!
l'atra cosa che mi è venuta in mente è che potrei provare un codice simile per essere sicuro al 100% che viene costruito questo oggetto anonimo...
e con tanta amarezza ho scoperto che non è cosi' !!
il codice che ho provato è questo:

using System;
using System.Collections.Generic;
using System.Text;

namespace ComportamentoDelCostruttore
{

class A{

private int intero;
public A(int x){
intero = x;
Console.WriteLine(" public A(int x) ...");
}
public A(){
intero = 0;
Console.WriteLine(" public A() ...");
}

}
class B {
public B(){

Console.WriteLine(" public B() ...");
}
public B(A a){
Console.WriteLine(" public B(A a) ...");
}

}

class Program
{
static void Main(string[] args)
{
int e = 0;
B b = new B(e);
Console.ReadLine();
}
}
}


quindi non ho ancora capito perchè il thread può essere costruito con un metodo....
spero che qualcuno sia in grado di rispondere ! :stordita:

-fidel-
08-10-2006, 11:54
Non mi è chiara una cosa: nel codice da te postato, dov'è il thread concorrente?

eve
08-10-2006, 12:03
Non mi è chiara una cosa: nel codice da te postato, dov'è il thread concorrente?

il codice che ho postato serviva per farmi capire se C# costruiva un oggetto anonimo...
se questo succedeva allora B b = new B(e); doveva compilare in quanto A ha un costruttore con int. per cui, si costruisce un oggetto anonimo di tipo A, e poi viene passato al costruttore di B. però questo non succede !
ps: in C++ o in java(non mi ricordo in quale) questa cosa funziona !

-fidel-
08-10-2006, 12:12
il codice che ho postato serviva per farmi capire se C# costruiva un oggetto anonimo...
se questo succedeva allora B b = new B(e); doveva compilare in quanto A ha un costruttore con int. per cui, si costruisce un oggetto anonimo di tipo A, e poi viene passato al costruttore di B. però questo non succede !
ps: in C++ o in java(non mi ricordo in quale) questa cosa funziona !

Ah ok: in effetti quella riga ha attirato la mia attenzione, C# è più "stretto" come tipizzazione di altri linguaggi OO, quindi mi sembrava strano che compilasse :)
Perdonami ma continuo a non capire il punto...

EDIT: in C# ti basta dichiarare il namespace System.Threading.Thread, i quali oggetti hanno un solo costruttore: ThreadStart, che ha come parametro il delegato alla funzione callback (o a un metodo di una classe esistente) che formerà il tuo nuovo thread.

eve
08-10-2006, 12:14
Ah ok: in effetti quella riga ha attirato la mia attenzione, C# è più "stretto" come tipizzazione di altri linguaggi OO, quindi mi sembrava strano che compilasse :)
Perdonami ma continuo a non capire il punto...

eh...ti capisco !! infatti sul titolo della discussione ho scritto "Domanda per un Guru di OO e C#".... ;)

-fidel-
08-10-2006, 12:21
eh...ti capisco !! infatti sul titolo della discussione ho scritto "Domanda per un Guru di OO e C#".... ;)

Spe scusami, tu hai scritto
non riesco a capire come mai un thread può essere costruito con il nome del metodo !
dalla documentazione di visual studio leggo che un Thread può essere costruito in 4 modi ma nessuno di questi costruttori corrisponde a un costruttore con un parametro di tipo metodo....però c'è un costruttore che prende un delegato

Appunto :)

allora ho pensato: beh..prende un metodo, crea un istanza anonima del delegato e tutto funziona !!

Non proprio... Il parametro delegato del costruttore della classe Thread fa da wrapper per la funzione callback da te specificata.

eve
08-10-2006, 12:34
Non proprio....

questo lo avevo capito dal codice che ho provato :)


Il parametro delegato del costruttore della classe Thread fa da wrapper per la funzione callback da te specificata.

ma non capisco che cosa succede quandi passi un metodo !
voglio dire: tu li passi un metodo (al costruttore del thread), quindi e come se facessi una assegnazione all'istanza del delegato...(probabilmente la classe thread avrà un campo dati di tipo "private ThreadStart nome;")
ma in pratica l'operatore di assegnazione non funziona per i delegati...
si usa il +=...
è qui che le cose non tornano !
vorrei capire cosa succede nel passaggio del parametro....

-fidel-
08-10-2006, 12:45
vorrei capire cosa succede nel passaggio del parametro....

Ecco questo è il punto :)

Ciò che accade è semplice: il concetto di delegato è simile a quello di puntatore a funzione del C++, con la differenza che non è un puntatore ma una classe (:)) e soprattutto è molto più "type-strict" di un normale puntatore a funzione/metodo, quindi è più sicuro di un normale puntatore per la risoluzione de tipi. Il delegato infatti ha bisogno di sapere il nome della funzione da chiamare ed i suoi parametri, così da riconoscerla in modo univico: l'Handle a tale funzione sarà poi gestito internamente dalla classe delegato, in modo trasparente al programmatore.
Quindi, il costruttore della classe Thread ha come un parametro un delegato: questo delegato ha bisogno di sapere il nome ed i parametri della funzione (callback) da chiamare, quindi passi semplicemente la funzione con i suoi parametri, proprio come se la stessi definendo. Da questo dati, il costruttore della classe Thread crea un delegato, il quale fara da wrapper (nel nostro caso da puntatore a funzione) per la funzione/metodo da te indicata. Chiarisco che non si tratta di un'assegnazione all'istanza del delegato, bensì un delegato viene creato (istanziato) per puntare alla funzione da te indicata.