View Full Version : [C#] Difficoltà con properties
Ciao, ho una struct Arco di questo tipo:
struct Arco
{
int id;
int end1;
int end2;
// Costruttore
public Arco(int p1, int p2, int p3)
{
id = p1;
end1 = p2;
end2 = p3;
}
}
e in una classe vorrei inserire una properties relativa a una lista di Arco, la properties vorrei che in lettura mi restituisse elemento deciso dall'utente tramite l'indice dell'elemento, mentre in scrittura vorrei aggiungere un elemento alla lista, avevo abbozzato qualcosa del genere:
public class Grafo
{
private List<Arco> archi = new List<Arco>();
public Arco Archi
{
get
{
return archi[???];
}
set
{
archi.Add(value);
}
}
}
ma credo sia completamente fuori strada vero? come lo imposto?!
PS. Inoltre mi da errore :
Accessibilità incoerente: il tipo di proprietà 'ASDlib.Arco' è meno accessibile della proprietà 'ASDlib.Grafo.Archi'
Più che di una property avresti bisogno di Metodi, inoltre il problema sull'accessibilità lo risolvi impostando lo stesso qualificatore d'accesso su entrambi :
public struct Arco
{
int id;
int end1;
int end2;
// Costruttore
public Arco(int p1, int p2, int p3)
{
id = p1;
end1 = p2;
end2 = p3;
}
}
public class Grafo
{
private List<Arco> archi = new List<Arco>();
public Arco GetArco(int indice)
{
return archi[indice];
}
public void AddArco( Arco arco )
{
archi.Add(arco);
}
}
Più che di una property avresti bisogno di Metodi, inoltre il problema sull'accessibilità lo risolvi impostando lo stesso qualificatore d'accesso su entrambi :
public struct Arco
{
int id;
int end1;
int end2;
// Costruttore
public Arco(int p1, int p2, int p3)
{
id = p1;
end1 = p2;
end2 = p3;
}
}
public class Grafo
{
private List<Arco> archi = new List<Arco>();
public Arco GetArco(int indice)
{
return archi[indice];
}
public void AddArco( Arco arco )
{
archi.Add(arco);
}
}
Infatti cosi piu era sensato, però da "consegna" devo usare una properties archi, non c'è modo di impostarla per ciò?
tanto per rendere accessibile una lista tramite properties non devo assegnare a get la restituzione di una cella e a set l'aggiunta di una cella in teoria?
tomminno
04-12-2009, 21:44
Infatti cosi piu era sensato, però da "consegna" devo usare una properties archi, non c'è modo di impostarla per ciò?
Le proprietà non sono altro che una convenzione di scrittura dei metodi senza parametri. All'atto della compilazione vengono creati i rispettivi metodi get_NomeProprietà per il get e set_NomeProprietà per il set.
Il seguente codice ovviamente non compila:
class Prova
{
public int Pippo
{
get { return 0; }
}
public int get_Pippo()
{
return 0;
}
}
Dato che sono metodi senza parametri non hai modo di passare l'indice richiesto.
Puoi descrivere meglio quali sono le specifiche di "consegna"?
||ElChE||88
04-12-2009, 21:45
tanto per rendere accessibile una lista tramite properties non devo assegnare a get la restituzione di una cella e a set l'aggiunta di una cella in teoria?
Al get della property non puoi passare valori, quindi è impossibile fare qualcosa come "la properties vorrei che in lettura mi restituisse elemento deciso dall'utente tramite l'indice dell'elemento".
Se vuoi poter usare codice tipo:
grafo.Archi.Add(x);
x = grafo.Archi[i];
ti basta una property del genere (rendere semplicemente accessibile la lista)
public List<Arco> Archi { get { return archi; } }
con tutti gli svantaggi che ciò comporta (accesso diretto).
Se invece vuoi poter usare codice tipo:
grafo[i] = x;
x = grafo[i];
devi usare un indexer property
public Arco this[int i]
{
get
{
return archi[i];
}
set
{
archi[i] = value;
}
}
(magari filtrando l'input)... però per aggiungere un elemento avrebbe ben poco senso.
Secondo me la combinazione migliore è un indexer property per prelevare un elemento + un metodo Add per aggiungere un elemento.
Kralizek
05-12-2009, 11:25
Più che di una property avresti bisogno di Metodi, inoltre il problema sull'accessibilità lo risolvi impostando lo stesso qualificatore d'accesso su entrambi :
public struct Arco
{
int id;
int end1;
int end2;
// Costruttore
public Arco(int p1, int p2, int p3)
{
id = p1;
end1 = p2;
end2 = p3;
}
}
public class Grafo
{
private List<Arco> archi = new List<Arco>();
public Arco GetArco(int indice)
{
return archi[indice];
}
public void AddArco( Arco arco )
{
archi.Add(arco);
}
}
mi dispiace contraddirti marco, ma puoi creare metodi con indice di accesso :)
in c#
public class Grafo
{
private List<Arco> archi = new List<Arco>();
public Arco this [ int index ]
{
get { return archi[index]; }
set { archi[index] = value; }
}
}
nb: va aggiunto il controllo dei valori immessi perchè un index non valido può causare l'eccezione outofrangeexception :)
mi dispiace contraddirti marco, ma puoi creare metodi con indice di accesso :)
in c#
public class Grafo
{
private List<Arco> archi = new List<Arco>();
public Arco this [ int index ]
{
get { return archi[index]; }
set { archi[index] = value; }
}
}
nb: va aggiunto il controllo dei valori immessi perchè un index non valido può causare l'eccezione outofrangeexception :)
Ma io non mi sento mica contraddetto. :p
So bene che esistono le indexed properties...
La mia era una risposta al post d'apertura, in cui viene chiesto : "la properties vorrei che in lettura mi restituisse elemento deciso dall'utente tramite l'indice dell'elemento, mentre in scrittura vorrei aggiungere un elemento alla lista".
Se applichiamo la tua soluzione e facciamo :
Arco A = new Arco(1, 2, 3);
Grafo G = new Grafo();
G[0] = A;
va in errore. Che senso ha accodare un nuovo Arco alla List passando un indice ? Bisognerebbe controllare se quell'indice esiste nella List, e poi comunque accodare il nuovo elemento chiamando l'Add() sulla List, perchè altrimenti la property esegue un'operazione di sostituzione all'indice in input, e non di accodamento. A questo punto continuo a pensare che 2 metodi di GetArco e SetArco fossero la soluzione migliore.
Solo DOPO si è parlato della "consegna", e allora a quel punto ( ma SOLO a quel punto ) sono più d'accordo con quanto scritto da ||ElChE||88 : "Secondo me la combinazione migliore è un indexed property per prelevare un elemento + un metodo Add per aggiungere un elemento".
Kralizek
05-12-2009, 15:31
mi hai fatto! :p
vale come scusante che ero di fretta e che stavo facendo tardi alla versione stoccolmese di "una manifestazione politica che si è tenuta in molte città europee"?
"una manifestazione politica che si è tenuta in molte città europee"
Se me lo scrivi in stoccolmese puoi considerarti ampiamente scusato. :D
Kralizek
06-12-2009, 03:46
"jag var för sen till en politiskdemonstration som hållas i många europeiska stader" :Prrr:
"jag var för sen till en politiskdemonstration som hållas i många europeiska stader" :Prrr:
Bravo ! :D
( Potevi scrivere qualsiasi cosa, chi minghia lo sa lo svedese ?! :p )
Kralizek
07-12-2009, 08:23
Google Translator ;)
public class Grafo
{
private List<Arco> archi = new List<Arco>();
public Arco this [ int index ]
{
get { return archi[index]; }
set { archi[index] = value; }
}
}
riguardo questo ho una domanda:come accedo poi? cioè non posso assegnare un nome alla properties giusto?
||ElChE||88
07-12-2009, 15:53
public class Grafo
{
private List<Arco> archi = new List<Arco>();
public Arco this [ int index ]
{
get { return archi[index]; }
set { archi[index] = value; }
}
}
riguardo questo ho una domanda:come accedo poi? cioè non posso assegnare un nome alla properties giusto?
Ci accedi come se fosse un array...
x = grafo[0];
grafo[2] = x;
Ovviamente l'indice non deve per forza essere di tipo int.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.