Proprietà Getter con argomenti

Immagino di averlo già visto da qualche parte prima, ma ora non riesco a ricordare né l’ho trovato, c’è un modo per creare una proprietà getter con argomenti?

Voglio dire, come posso convertire “float getSize ();” “float Size”

float getSize() { return this.size; } float Size { get { return this.size; } } 

Quindi, potrei convertire, ad esempio, “float getSize (String unit);” a “float Size (String unit)” o qualcosa del genere?

 float getSize(String unit) { return this.size; } float Size(String unit) { get { if (unit == Unit.Meters) return this.size/100; else return this.size; } } 

Penso che non ci sia davvero alcun problema di usare la funzione, ma potrebbe sembrare migliore in questo modo: p

Per rispondere alla domanda: No, non è ansible, e come già sottolineato, un getter con un parametro apparirebbe come un metodo.

La cosa a cui stai pensando potrebbe essere una proprietà di default indicizzata, che assomiglia a questo:

 class Test { public string this[int index] { get { return index.ToString(); } } } 

Questo ti permette di indicizzare in un’istanza di Test, in questo modo:

 Test t = new Test(); string value = t[1]; 

Ma proprio come la curiosità … Avere proprietà con parametro è ansible in VB .Net

Sembra come segue:

  Public ReadOnly Property oPair(param As String) As Result Get 'some code depends on param End Get End Property 

Non funziona meglio delle normali funzioni, ma a volte è bello avere questa possibilità.

È ansible che un object di class abbia in modo ragionevolmente efficiente qualcosa che si comporta come un getter di proprietà indicizzato con nome avendo una proprietà restituisce una struct che contiene semplicemente un riferimento privato all’object class e include un getter di proprietà indicizzato che si incatena a un metodo in la class. Una tale struttura a singolo object può essere generata praticamente senza alcun costo (può probabilmente inserirsi in un registro e verrà caricata con un valore che si trova in un altro registro, il JIT potrebbe persino essere in grado di riconoscere che lo stesso registro può essere utilizzato per entrambi gli scopi), quindi se usare un getter di questo tipo rende il codice più leggibile, questo è un argomento sostanziale a favore.

Sfortunatamente, l’incapacità dei membri della struct di indicare se modificano o meno la struttura sottostante rende imansible utilizzare lo stesso approccio per un setter di proprietà indicizzato. Anche se sarebbe utile, si potrebbe avere un OrderedCollection con qualcosa di simile:

 struct ByIndexAccessor { OrderedCollection owner; ByIndexAccessor(OrderedCollection o) { owner = o; } T this[int index] { get { return owner.handleGet(index); } set { owner.handleSet(index, value); } } } ByIndexAccessor ByIndex { get {return new ByIndexAccessor(this); } } 

e dì myCollection.ByIndex[3] = newThing; , C # rifiuta tale codice perché non ha modo di sapere che questa particolare implementazione del set indicizzato può essere tranquillamente utilizzata su una struttura di sola lettura.