2011-05-22 12 views
16

Supongo que he visto algo antes, pero ahora no puedo recordar ni encontrarlo, ¿hay alguna manera de hacer una propiedad getter con argumentos?Propiedad Getter con argumentos

Quiero decir, como puedo convertir "float getSize();" a "Tamaño flotar"

float getSize() { 
    return this.size; 
} 

float Size { 
    get { return this.size; } 
} 

Entonces, podría convertir, por ejemplo, "flotar getSize (unidad String);" para "flotar tamaño (unidad de cuerda)" o algo así?

float getSize(String unit) { 
    return this.size; 
} 

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

Creo que no hay realmente un problema de la utilización de la función en absoluto, pero puede verse mejor así: P

+7

Si los getters toman argumentos, ¿no se verían exactamente como las llamadas a métodos? – BoltClock

+3

@BoltClock: Sí, supongo. Se implementan como llamadas al método bajo el capó de todos modos. Y VB.NET * does * permite que getters se definan con parámetros arbitrarios. –

Respuesta

24

Para responder a la pregunta: No, no es posible, y como ya se ha señalado, una getter con un parámetro se vería como un método.

Lo que está pensando podría ser una propiedad indexada por defecto, que se ve así:

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

Esto le permite indexar en una instancia de prueba, así:

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

Gracias, temía que no fuera posible. Pero como su nombre lo indica, trato de mantener las propiedades para obtener "propiedades" o parámetros relacionados con los objetos, y métodos para manipular y calcular otras cosas.Como no hay otra opción, tendré que usar los métodos entonces: D – Dane411

+3

@ Dane411: en realidad se recomienda que los getters que realizan operaciones costosas más allá de simplemente devolver el valor de un campo privado (como leer datos de un archivo), o aquellos que necesitan tomar parámetros, implementarse en términos de un método regular. Nómbrelos 'GetXXX()' y todos entenderán su código muy bien. –

+0

Gracias Cody, eso es lo que hice. Pero no era tan caro, pero obtuve un artículo de una matriz ... Así que pensé en ello un poco más, y como dijo driis, logré un enfoque con una clase interna con una propiedad indexada (a pesar de que el método es más barato) en recursos) :) – Dane411

13

Pero al igual que la curiosidad ... Tener una propiedad con el parámetro es posible en VB .Net

Se parece a lo siguiente:

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

No funciona mejor que la función normal, pero en algún momento es bueno tener esa posibilidad.

0

Es posible que un objeto de clase tenga razonablemente eficiente algo que se comporte como un identificador de propiedad indexado al tener una propiedad return a struct que simplemente contiene una referencia privada al objeto de clase e incluye un getter de propiedad indexada que cadenas a un método en la clase. Dicha estructura de un solo elemento se puede generar básicamente sin costo (puede encajar en un registro, y se cargará con un valor que está en otro registro; el JIT incluso podrá reconocer que se puede usar el mismo registro para ambos propósitos), así que si el uso de dicho getter hace que el código sea más legible, ese es un argumento sustancial a favor.

Desafortunadamente, la incapacidad de los miembros de la estructura para indicar si modifican o no la estructura subyacente hace que sea imposible usar el mismo enfoque para un conjunto de propiedades indexadas. A pesar de que sería útil que uno podría tener tener un OrderedCollection<T> con algo como:

struct ByIndexAccessor { 
    OrderedCollection<T> owner; 
    ByIndexAccessor(OrderedCollection<T> o) { owner = o; } 

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

y decir myCollection.ByIndex[3] = newThing;, C# rechazaría dicho código porque no tiene forma de saber que este particular indexados set aplicación segura se puede utilizar en una estructura de solo lectura.

Cuestiones relacionadas