Ссылка на резервное поле автоматически реализуемого свойства

В C # автоматически реализуемые свойства очень удобны. Однако, хотя они ничего не делают, кроме инкапсуляции своего поля поддержки, они по-прежнему не могут быть переданы как аргументы ref или out. Например:

public int[] arr { get; private set; } /* Our auto-implemented property */
/* ... */
public void method(int N) { /* A non-static method, can write to this.arr */
    System.Array.Resize<int>(ref this.arr, N); /* Doesn't work! */
}

В этом конкретном случае мы можем решить проблему с помощью такого хака:

public void method(int N) { /* A non-static method, can write to this.arr */
    int[] temp = this.arr;
    System.Array.Resize<int>(ref temp, N);
    this.arr = temp;
}

Есть ли более элегантный способ использования ссылки на поле поддержки автоматически реализуемого свойства в C #?


person Mints97    schedule 29.01.2015    source источник


Ответы (2)


Есть ли более элегантный способ использования ссылки на поле поддержки автоматически реализуемого свойства в C #?

Насколько я знаю, это не так. Свойства - это методы, поэтому вы не можете передать их таким образом, когда параметр ожидает тип своего резервного поля.

То, что вы описали как решение, является решением, если вы хотите использовать автоматические свойства. В противном случае вам придется самостоятельно определить резервное поле и позволить свойству работать с ним.

Примечание: вы можете получить поле поддержки авто-свойства путем отражения, но это хакерское решение, которое я бы не использовал.

person Ondrej Janacek    schedule 29.01.2015
comment
Спасибо за ответ, это действительно помогло =) Приму как можно скорее - person Mints97; 29.01.2015
comment
Хотя да, свойства являются методами, автоматические свойства имеют и свойство, и поле с одним и тем же концептуальным именем, и компилятор должен быть достаточно умен, чтобы определить, что вы хотите ссылаться на поле, а не на свойство в этом контексте. Это похоже на волшебство, которое происходит с ключевым словом event - это и поле делегата, и набор методов добавления / удаления, которые действуют в этом поле. К сожалению, это не так, и вам нужно преобразовать свойство auto в обычное с явным полем поддержки, если вы хотите такое поведение. - person Miral; 13.10.2015

из MSDN,

Ключевые слова ref и out нельзя использовать для следующих типов методов:

  • Асинхронные методы, которые вы определяете с помощью модификатора async.
  • Методы итератора, которые включают оператор yield return или yield break.
  • Свойства - это не переменные. Это методы, и их нельзя передать параметрам ref.
person Rohit Prakash    schedule 29.01.2015