Вызов .clone () слишком много раз в vb, вызовет ли это какие-либо проблемы?

#windows #vb.net #visual-studio #shallow-copy

#Windows #vb.net #visual-studio #мелкое копирование

Вопрос:

Я инженер по встраиванию, и я никогда не работал ни с Windows, ни с Visual Basic. Для моей текущей задачи я должен поддерживать и улучшать тестовую систему, работающую в Windows, написанную в Visual Studio, C # (также не имею опыта). В этом проекте используются некоторые библиотеки, написанные на Visual Basic (весь устаревший код). И я обнаруживаю проблему там. Я не могу скопировать код непосредственно сюда, но из-за юридических привязок, но это что-то вроде этого:

 'getter()
dim temp as byte = global_data
Array.reverse(temp);
...
  

Это функция получения. Поскольку внутри есть обратное, возврат этой функции отличается после каждого вызова, потому что при изменении temp также изменяется global_data. И я могу получить реальное значение только после нечетного числа вызовов. Предыдущий обработчик сказал мне вызывать функцию только один или три раза… Я думаю, что это глупо, и изменил его, добавив .clone() вот так:

 dim temp as byte = global_data.clone()
Array.reverse(temp);
  

И это сработало 🙂
Существует множество подобных функций, поэтому я собираюсь внести в них аналогичные изменения.
Но поскольку я не знаком с динамикой этой системы, я боюсь столкнуться с проблемой позже. Например, может ли создание нескольких клонов потреблять мою оперативную память? Могут ли эти клоны быть уничтожены? Если да, должен ли я их уничтожить? Как?
Или есть какие-либо другие возможные проблемы?
И есть ли другой способ сделать это?

Заранее спасибо!

Комментарии:

1. global_data выглядит как массив, а не функция, если только она не возвращает существующее значение поля (но это кажется глупым ). Клонирование массива в методе, который dim temp as byte() = DirectCast(global_data.clone(), byte()) влияет на метод, в котором temp определен, тогда он выйдет за рамки. Наличие Option Strict On очень помогает, попробуйте установить его по умолчанию.

2. Подразумевал ли я, что это функция? Если это так, я могу исправить. Это глобальная переменная. Он определен в другом месте, но вызывается здесь, поэтому я думаю, что он глобальный, как глобальные переменные в C. Я проверю этот параметр. Спасибо

Ответ №1:

Чтобы ответить на ваш вопрос, нет ничего плохого в вызове Clone несколько раз. Клонированные массивы байтов будут занимать память до тех пор, пока на них ссылаются, но это не уникально для клонируемого массива байтов. Предположительно, этот клонированный массив байтов передается другим методам. Как только эти методы будут выполнены, массив будет иметь право на сборку мусора, и система позаботится об этом. Если этот код выполняется очень и очень часто, могут быть лучшие подходы, которые более эффективны, чем выделение и последующая сборка мусора из этих массивов, но вы ничего не «сломаете», используя Clone over over.

Ответ №2:

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