Свойство 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
Ответы
Ответ 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
может быть безопасно использована в структуре только для чтения.