Как заявили dwc и Adam Jaskiewicz, виновник, скорее всего, убийца OOM. Тем не менее, следующий вопрос, который следует ниже: Как мне предотвратить это?
Есть несколько способов:
Я обнаружил, что (2) особенно легко реализовать благодаря этой статье .
Сериализация с BinaryFormatter
- у вас большие проблемы, если вам нужно изменить свойство на " стандартное свойство позже, например, чтобы добавить некоторую проверку / обработку событий / и т. д. - sinc BinaryFormatter
использует имена полей. И вы не можете дублировать это, поскольку имя поля, которое генерирует компилятор, не может быть записано как допустимое C #.
Это хороший повод вместо этого взглянуть на сериализатор на основе контрактов. См. эту запись в блоге для получения дополнительной информации.
для всего проекта. У простых свойств нет недостатков. Компилятор создает для вас резервное поле. Эта запись в блоге объясняет, как компилятор обрабатывает автоматически реализованные свойства.
Дело в том, что там есть соответствующее поле. Вы просто не видите этого, потому что компилятор создает это за вас. Автоматические свойства - это просто синтаксический сахар или сокращенный способ создания поля.
You can't create truly read only property, because you have to define both setter and getter. You can only use private setter to achieve pseudo-readonly property from outside.
Otherwise, as said above there are no other disadvantages.
На самом деле это не недостаток, но вы должны знать значения по умолчанию для автоматических свойств. В «классических» свойствах мы всегда использовали для инициализации вспомогательных полей, например, вот так:
private bool _flag = true;
public bool Flag
{
get { return _flag; }
set { _flag = value; }
}
Это сделало очевидным, какое значение свойства по умолчанию.
В автоматических свойствах вы должны знать, какие значения по умолчанию для разных типов (например, false для bool). Если вы не хотите, чтобы свойство имело значение по умолчанию, вы должны инициализировать его в конструкторе:
class MyClass
{
public bool Flag { get; set; }
public MyClass()
{
Flag = true;
}
}
Это означает, что вы должны реализовать конструктор , если вы хотите инициализировать свои свойства не по умолчанию. значения или если свойство относится к ссылочному типу (классу).
Но, как я уже писал, я не считаю это недостатком, просто то, что вам нужно знать.
Ничего особенного. Только крайние случаи, например, когда вам нужно передать свойство методу, где параметр передается по ссылке ( ref
или out
), что невозможно со свойством (потому что внутри это просто методы get_Property / set_Property, реализованные компилятором, а не какие-то специальные поля), и для этого вам понадобится явное закрытое поле поддержки.
РЕДАКТИРОВАТЬ: Да, и поддерживая свойства «no readonly
», что на самом деле довольно часто.
Если вам не нужно выполнять какую-либо конкретную логику в методах доступа get и / или set, недостатков нет ...
Я говорю, что они плохие с точки зрения читаемости кода. Синтаксический сахар хорош для написания кода, но ужасен для чтения кода. Как разработчики, код, который мы оставляем позади, в конечном итоге будет унаследован каким-то плохим разработчиком, которому придется разобраться в том, что мы сделали и что происходит в коде. Я действительно против изменения языка, чтобы просто сохранить нажатие клавиш, когда существует установленный синтаксис для тех же конструкций.