Свойство геттера с аргументами - PullRequest
26 голосов
/ 22 мая 2011

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

Я имею в виду, как я могу конвертировать "floatGETSIZE ();»в "float Size"

float getSize() {
    return this.size;
}

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

Тогда, можно ли преобразовать, например, "float getSize (String unit);""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

Ответы [ 3 ]

31 голосов
/ 22 мая 2011

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

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

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

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

Test t = new Test();
string value = t[1];
19 голосов
/ 26 января 2015

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

Похоже на следующее:

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

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

0 голосов
/ 27 января 2015

Для объекта класса возможно достаточно разумно иметь то, что ведет себя как получатель именованного индексированного свойства, если свойство возвращает struct, которое просто содержит частную ссылку на объект класса и включает в себя получатель индексированного свойства, который цепочки к методу в классе. Такая одноэлементная структура может быть сгенерирована практически без затрат (она, вероятно, может поместиться в регистр и будет загружена значением, которое находится в другом регистре; 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;, C # отвергнет такой код, потому что не может знать, что эту конкретную индексированную реализацию set можно безопасно использовать в структуре только для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...