Ссылка на поле поддержки автоматически реализуемого свойства
В 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#?
2 ответа
Есть ли более элегантный способ использовать ссылку на поле поддержки автоматически реализуемого свойства в C#?
Насколько я знаю, это не так. Свойства - это методы, поэтому вы не можете передать их таким образом, когда параметр ожидает тип своего вспомогательного поля.
То, что вы назвали решением, является решением, если вы хотите использовать авто-свойства. В противном случае вам придется самостоятельно определить вспомогательное поле и разрешить свойству работать с ним.
Примечание: вы можете получить поле поддержки авто-свойства по отражению, но это хакерское решение, которое я бы не использовал.
Из MSDN,
Вы не можете использовать ключевые слова ref и out для следующих методов:
- Асинхронные методы, которые вы определяете с помощью модификатора async.
- Методы итератора, которые включают в себя возврат доходности или оператор разрыва доходности.
- Свойства не являются переменными. Они являются методами и не могут быть переданы в параметры ref.