Почему вы используете этот оператор using в ASP.NET?

Рефакторинг кода снова. Видя некоторые из них на одной из страниц ASP.NET:

using (TextBox txtBox = e.Row.Cells[1].FindControl("txtBox") as TextBox)
{
}

Нет необходимости удалять txtBox, потому что это просто ссылка на существующий элемент управления. И вы не хотите, чтобы управление было удалено вообще. Я даже не уверен, что это не вредно, - похоже, он попросил, чтобы базовый элемент управления был удален ненадлежащим образом (хотя я еще не видел никаких побочных эффектов от его использования таким образом).

Ответы

Ответ 1

TextBox наследует реализацию IDisposable из Component суперкласса. Эта реализация удаляет компонент из сайта, если он есть.

Таким образом, это может иметь необоснованные последствия, если текстовое поле действительно находится в контейнере сайта. Кроме того, после вызова Dispose() объекта, вы не должны использовать его снова, независимо от того, что (оно больше не используется в состоянии использования).

Я бы предложил вам избежать этого шаблона с помощью веб-элементов управления ASP.NET.

Ответ 2

Это неправильно, его нельзя использовать так. Я бы предположил, что есть потенциальные проблемы с этим, которые не появятся сразу. Текстовые файлы dispose вызываются при выходе из оператора using, но он не будет собираться немедленно. Если он будет собран, у вас возникнут проблемы позже, когда вы попытаетесь получить доступ к этому элементу управления.

Ответ 3

Экземпляр TextBox потенциально может быть нулевым, если не найден, поэтому Dispose() вызывается как NullReferenceException.

Я никогда не видел эту схему на практике, но если вам нужно ее использовать, было бы полезно обработать любые потенциальные ошибки.

Ответ 4

Не должно быть отрицательных вторичных эффектов, но это не обязательно. Если бы мы выполнили using (x) { ... } все, что реализует IDisposable в CLR, большинство С# -кодов будут нечитабельны.

Ответ 5

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

Ответ 6

Из MSDN:

Внутри блока использования объект доступен только для чтения и не может быть изменен или переназначен.

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