VB .NET - как я могу создать массив ссылок на двойники? - PullRequest
1 голос
/ 23 июня 2011

В моей программе есть несколько переменных типа Double, например,

Dim Area as Double = 0
Dim Perimeter as Double = 0

Где-то в моей программе я хочу вычислить эти значения, поэтому я определяю

Public Sub TheSquare(ByRef TheArea as Double, ByRef ThePerim as Double, ByVal TheSide as Double)
    TheArea = TheSide^2
    ThePerim = 4 * TheSide
End Sub

и где-то в программе я собираю длины сторон и вычисляю площадь и периметр;скажем

While True
    S = GetSideValueFromSomewhere()
    TheSquare(Area, Perimeter, S)
End

В моей реальной программе, скажем, 20 величин, которые я хочу вычислить.Очевидно, у каждого свое уравнение.Но в конце я хочу вывести все 20 в файл, поэтому, чтобы сохранить набор текста, я создаю массив величин, например:

Dim TypingSaver() as Double = {Area, Perimeter}

, чтобы я мог сбросить значения в файл с тремя-линейный цикл for вместо копирования и вставки 20 имен переменных.

Это именно то, что я хочу, если Area и Perimeter были ссылочными типами, такими как Objects.Но так как они являются Doubles, TypingSaver содержит только их значения, а не ссылки на фактические переменные.Поэтому после того, как я использую свою функцию TheSquare, значения Area и Perimeter корректно обновляются, но TypingSaver просто содержит те значения, которые были у Area и Perimeter, когда я объявил массив.

Итак, вопрос: как я могу создатьмассив ссылок на двойники в VB.NET?

Ответы [ 4 ]

3 голосов
/ 23 июня 2011

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

Что я бы порекомендовал создать другой класс, который будет содержать все ваши переменные (имя 20 переменных) в качестве свойств (получить и установить), а затем переопределить метод ToString, который будет возвращать список всех ваших переменных. Поэтому, когда вам нужно сбросить эти переменные, вы вызовете метод ToString (), и он вернет текущие значения всех ваших параметров.

0 голосов
/ 28 ноября 2012

Довольно похоже на ваш самый последний ответ, вы захотите обернуть ваши типы как «Nullable», что в основном делает его объектом, который может быть нулевым, но также и ссылочным типом.

Т.е.. Dim testDouble as Nullable(Of Double) или Dim testDouble2 as Double?

См:

0 голосов
/ 12 июля 2011

Идея одноэлементного массива была ужасной. Код стал ужасно медленным. Есть еще одна работа, предложенная другом: создайте класс-обёртку так:

Public Class DoubleWrapper
    Public Value As Double
End Class

Тогда, когда будет создан массив DoubleWrappers, он будет, конечно, по ссылке.

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

0 голосов
/ 23 июня 2011

Есть противный способ сделать это. Все числовые типы являются типами значений, но массивы являются ссылочными типами. Так что я могу поменять все свои двойные на массивы двойных, например:

Dim Area(0) as Double
Dim Perimeter(0) as Double

Так что теперь Area и Perimeter - это 1-элементные массивы double. Мой «цикл зацикливания» становится

Dim TypingSaver() as Array = {Area, Perimeter}

Теперь TypingSaver хранит ссылки на площадь и периметр. Для меня это было легким изменением, потому что я мог искать и заменять объявление Double, изменять тип для TypingSaver, а затем в двух других местах мне пришлось изменить прямой доступ к этой форме:

TypingSaver(1) = 7

до

TypingSaver(1).SetValue(7, 0)

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

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

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