Подтвердить что ты не робот

Свойство Getter с аргументами

Я предполагаю, что я видел где-то раньше, но теперь я не могу вспомнить и не найти его, есть ли способ сделать свойство getter аргументами?

Я имею в виду, поскольку я могу преобразовать "float getSize();" для "float Size"

float getSize() {
    return this.size;
}

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

Затем я мог бы преобразовать, например, "float getSize (String unit)"; to "float Size (String unit)" или что-то в этом роде?

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

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

Я думаю, что нет никакой проблемы с использованием функции вообще, но она может выглядеть лучше: P

4b9b3361

Ответ 1

Чтобы ответить на вопрос: Нет, это невозможно, и как уже указывалось, геттер с параметром будет выглядеть точно так же, как метод.

То, о чем вы думаете, может быть индексированным свойством по умолчанию, которое выглядит следующим образом:

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

Это позволяет вам индексировать экземпляр Test, например:

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

Ответ 2

Но как любопытство... Наличие свойства с параметром возможно в VB.Net

Похож:

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

Это не работает лучше, чем регулярная функция, но когда-нибудь было бы хорошо иметь такую ​​возможность.

Ответ 3

Объект класса может разумно-эффективно иметь что-то, что ведет себя как именованное свойство getter, с помощью свойства return a struct, которое просто содержит частную ссылку на объект класса и включает в себя индексированный атрибут getter, который цепочки к методу в классе. Такая структура одного элемента может быть сгенерирована практически без затрат (она может, вероятно, вписываться в регистр и будет загружена значением, которое в другом регистре, JIT может даже распознать, что один и тот же регистр может быть использован для обе цели), поэтому, если использование такого геттера делает код более читаемым, что существенный аргумент в пользу.

К сожалению, неспособность членов структуры указывать, изменяют ли они базовую структуру или нет, делает невозможным использование одного и того же подхода для индексатора свойств. Несмотря на то, что было бы полезно, у него могло бы быть OrderedCollection<T> с чем-то вроде:

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

и скажем myCollection.ByIndex[3] = newThing;, С# отвергнет такой код, потому что он не знает, что эта конкретная индексированная реализация set может быть безопасно использована в структуре только для чтения.