Как повторное использование объекта работает в .NET? - PullRequest
0 голосов
/ 09 января 2009

Я недавно перешел с VB6 на VB.NET, и, наконец, я добираюсь до понимания внутренней работы. Я смотрю на существующую кодовую базу моей компании, и я немного удивлен.

Я понимаю, что когда VB.NET создает строку, он видит, находится ли строка в памяти, а если нет, создает новый экземпляр этой строки, в противном случае он указывает новую переменную на старую. Однако мне интересно, если это происходит с другими объектами?

Причина, по которой я спрашиваю, состоит в том, что в моей новой компании есть объект DATABASE, который в основном оборачивает информацию о подключении к базе данных и подключения к базе данных в объекте.

У нас также есть объект BOOK и объект PAGES.

Моя лучшая практика в VB6 - создавать объект DATABASE, а затем передавать (byRef) его в объект BOOK, а затем в PAGES, чтобы вы передали один объект DATABASE в несколько книг, а затем PAGES.

Однако , как они сделали это, создали новый экземпляр объекта DATABASE на каждой странице и каждом объекте PAGE, что означает, что вы можете иметь несколько экземпляров (на самом деле тысячи) объектов, которые на самом деле все одинаково.

Это мудро? Или объекты обрабатываются как строки?

Ответы [ 3 ]

5 голосов
/ 09 января 2009

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

Если тысячи объектов базы данных «одинаковы», то, похоже, они действительно передают ссылку на один и тот же объект. Вам нужно понять разницу между ссылкой и объектом .

Наконец, ничто в вашем коде не должно удерживать соединения, по всей вероятности. Почти всегда лучше открыть соединение, сделать все, что нужно, а затем снова закрыть. Система пула соединений может обеспечить повторное использование соединения real с базой данных (создание которого относительно дорого).

2 голосов
/ 09 января 2009

Строки обрабатываются в специальном регистре, как и другие объекты. В то время как другие объекты застряли в куче (более подробно здесь ) Они интернированы (описание в разделе замечаний, http://msdn.microsoft.com/en-us/library/system.string.isinterned(VS.80).aspx.

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

1 голос
/ 09 января 2009

Во-первых: строка - это объект, который обрабатывается как тип значения (потому что это поведение, которое вы ожидаете), что означает, что всякий раз, когда вы выполняете присваивание / операцию (например, конкатенация, замена, ...), значение копируется в новый экземпляр класса string. Так, например: строка t = "алло"; т = т + «ты»; содержит 3 различных строковых экземпляра, содержащих: "hallo", "you" и "hallo you";

Относительно объекта базы данных ... посмотрите на ORM мапперы (я лично использую дозвуковые) Большую часть времени они используют следующее разделение: - объект базы данных (как у вас), управляющий подключением к базе данных - контроллер или адаптер, содержащий логику загрузки / извлечения, обновления, удаления (SCUM-операции) для каждого объекта, использующего объект базы данных. - объект, который содержит данные (например, объект книги)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...