Propriété Getter avec arguments

je suppose que j'ai vu quelque part avant, mais maintenant je ne me souviens pas ni trouver, Est-ce qu'il y a un moyen de faire une propriété getter avec des arguments?

je veux dire, comme je peux convertir " float getSize ();" en "float Size"

float getSize() {
    return this.size;
}

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

Ensuite, pourrais-je convertir par exemple, "float getSize(Chaîne de l'unité);" à "float Taille(String)" ou quelque chose comme ça?

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

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

je pense qu'il n'y a pas vraiment de problème d'utiliser la fonction du tout, mais peut regarder mieux de cette façon :P

20
demandé sur Teoman Soygul 2011-05-22 18:46:39

3 réponses

pour répondre à la question: non, il n'est pas possible, et comme déjà souligné, un getter avec un paramètre ressemblerait juste à une méthode.

la chose à laquelle vous pensez pourrait être une propriété par défaut indexée, qui ressemble à ceci:

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

ceci vous permet d'indexer dans une instance de Test, comme ceci:

Test t = new Test();
string value = t[1];
28
répondu driis 2011-05-22 14:54:29

Mais, tout comme la curiosité... Avoir une propriété avec paramètre est possible dans VB .Net

Ressemble à ce qui suit:

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

Il ne fonctionne pas mieux que la fonction régulière, mais parfois il est agréable d'avoir une telle possibilité.

17
répondu Damian Kobak 2015-01-26 12:15:39

il est possible pour un objet de classe d'avoir raisonnablement-efficacement quelque chose qui se comporte comme un getter de propriété indexée nommé en ayant un retour de propriété struct qui contient simplement une référence privée à l'objet class et inclut une propriété indexée getter qui enchaîne à une méthode de la classe. Une telle structure à un seul élément peut être générée sans aucun coût (elle peut probablement tenir dans un registre, et sera chargée avec une valeur qui est dans un autre registre; le JIT peut même être en mesure de reconnaître que le même registre peut être utilisé aux deux fins), donc si l'utilisation d'un tel getter rend le code plus lisible c'est un argument substantiel en faveur.

malheureusement, l'incapacité des membres de struct à indiquer s'ils modifient ou non la structure sous-jacente rend impossible l'utilisation de la même approche pour un setter de propriété indexé. Même s'il serait utile qu'il aurait pu avoir un OrderedCollection<T> avec quelque chose comme:

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); }
}

et dire myCollection.ByIndex[3] = newThing;, C# rejeter un tel code, car il n'a aucun moyen de savoir que ce indexé set l'implémentation peut être utilisée en toute sécurité sur une structure en lecture seule.

0
répondu supercat 2015-01-27 00:11:09