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

В 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.
Другие вопросы по тегам