Member 14152690 Ответов: 1

Ссылка в VB.NET


Я пытаюсь сослаться на intptr на значение (например, целое число), но я этого не делаю
найти решение

Dim a As Integer = 100 (a = 100)
Dim b As IntPtr = a (b = 100)
a = 50 (a = 50)
b = 100 (b = 100)

Я хочу, чтобы мне было 50, но я не могу найти решение.

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

Есть ли какой-нибудь способ отслеживать переменные или делать что-то в этом роде?

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

Что я уже пробовал:

Я пробовал с событиями, обертками, и даже так я не могу найти решение.

Кто-нибудь может мне помочь?

Недавно, заранее спасибо

phil.o

Вы не можете действительно имитировать язык Си с указателями в нем Vb.net или любой другой управляемый язык. Здесь вы должны присвоить b адрес переменной a, а не значение переменной a. Но я не знаю как это сделать vb.net. Я знаю, что c# может понимать небезопасные блоки, но я не уверен vb.net имеет эквивалентную функциональность. Управляемый код индуцирует тот факт, что вы вообще не должны заботиться об адресах памяти.

1 Ответов

Рейтинг:
10

Maciej Los

Я не уверен, что хорошо вас понимаю, но, похоже, вы хотите отслеживать изменения переменных.

1. Переменные отслеживания грязный для набора причин...
2. Если вы хотите получать информацию об изменениях переменных, используйте Class и вызовите событие в сеттере, например:

Public Class myVar
    Private mValue As Integer
    Public Event VariableChanged(ByVal mvalue As Integer)

    Public Property Variable() As Integer
        Get
            Variable = mValue
        End Get
        Set(ByVal value As Integer)
            mValue = value
            RaiseEvent VariableChanged(mValue)
        End Set
    End Property
End Class


Использование:
Public Class Form1
    Private WithEvents test As New myVar
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        test.Variable = CInt(TextBox1.Text)
    End Sub
    Private Sub VariableChanged(ByVal NewValue As Integer) Handles test.VariableChanged
        MessageBox.Show(NewValue)
    End Sub
End Class


Приведенный выше код исходит от: vb.net - обнаружение изменения переменной. [Решено] | DaniWeb[^]

Если я ошибаюсь и вы хотите отслеживать переменные во время отладки, используйте точки останова, см.: Установка часов для переменных - Visual Studio | Microsoft Docs[^]


phil.o

Мой 5-й :)
Разве вы не имели в виду точки останова вместо точек торможения?

Maciej Los

О да! Уровень кафе в моем теле слишком низок... Мне нужно заполнить его...
[РЕДАКТИРОВАТЬ]
Спасибо! Измененный ;)

Member 14152690

Это сработало, но я должен вручную отслеживать изменения. Дело в том, что:
Я пытаюсь подражать выражению С-типа.
int a = 100;
int *p;
p = &a;
Что-то вроде этого. Я изучал Си много лет назад, и я не очень хорошо помню его,
но подумайте, что таким образом вы получили адрес памяти, и когда a изменилось, я получил значение в p, независимо от того, сколько раз a изменилось.
Есть ли какой-нибудь способ?. Спасибо, новенький

Maciej Los

Даже если я не уверен, что вы подразумеваете под "отслеживанием вручную изменений", самый короткий ответ: Нет. VB.NET это не С.

Ralf Meier

Что Мацей имеет в виду, когда спрашивает "Почему" :
Возможно, для вас есть возможное решение, если мы поймем, чего вы на самом деле пытаетесь достичь ...

Maciej Los

Святая правда!
Спасибо, Ральф.

Member 14152690

В vb.net, выступает в качестве указателя IntPtr указатель и значение.метод GetHashCode, как адрес. Проблема в том, что gethashcode постоянно меняется. Это я хочу отслеживать, хэш-код переменной.

phil.o

Метод GetHashCode() не имеет ничего общего с адресами памяти :)

Member 14152690

Решение, которое вы мне дали раньше, работает, если я изменяю тип переменных (например, a на wrapper и b на wrapper), но я хочу, чтобы переменная оставалась нетронутой.

Member 14152690

Простите, я имел в виду переменную "а" нетронутой

Maciej Los

Указателя IntPtr Структуры (Система) | Майкрософт Документы[^] может выступать в качестве указателя или дескриптора. Извините, но я все еще не могу понять, что вы имеете в виду.

Member 14152690

dim a как целое число = 100
Дим P в качестве указателя IntPtr
Р = маршал.оператор sizeof(а)
p = a.gethashcode или p = a (в эффектах это одно и то же)
Итак, a = 100 и p = 100
а = 50
Итак, a = 50 и p = 100

Именно это я имею в виду, когда говорю о переменных отслеживания. Я хочу, чтобы р было 50, а не 100.

класс-оболочку
значение публичного свойства в виде целого числа
end класса

Дим, а как новой обертке, б в качестве новой обертке
а.значение = 100
б.значение = а
Если я пишу так, это работает, но я хочу, чтобы переменная 'a' была собственным типом (целочисленным, в данном случае), а не оболочкой. Ах, и забыл об этом (я не уверен, что это происходит с указателями int c) Если я пишу с оболочками, смена б меняет. Я пытаюсь определить, что изменение переменной b при переменной смене, но не переменная изменение переменной изменение, Когда б.

Спасибо

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

Ralf Meier

Каждый путь, который ты нам показал, говорит одно и то же :
Вы прямо или косвенно присваиваете значение от "А" до "р" - но только в момент инструкции.
То, что вы хотите иметь, - это что - то вроде привязки-каждый раз, когда "а" меняет свое значение, то же самое должно происходить и с "р" - р автоматически получает значение от "А".
Но... для чего тебе это нужно ? Какой в этом скрытый смысл? ..
Пожалуйста, поймите - потому что я не понял смысла, я не в состоянии дать полезный ответ ...

Maciej Los

Честно говоря, я понимаю, что вы хотите использовать 'p' в качестве указателя (адрес переменной 'a' в памяти), но(!) я уже упоминал об этом VB.NET это не С. И строго говоря: VB.NET у него нет указателей (и уж точно не таких, как указатели с).
В этот момент самая близкая мысль, которая пришла мне в голову, - это использовать Делегаты (Visual Basic)[^], которые иногда описываются как типобезопасные указатели функций, поскольку они похожи на указатели функций, используемые в других языках программирования. Но в отличие от указателей на функции, делегаты Visual Basic-это ссылочный тип, основанный на системе классов.Делегат. Делегаты могут ссылаться как на общие методы — методы, которые могут быть вызваны без конкретного экземпляра класса, — так и на методы экземпляра.
Извините, но другого выхода я не вижу...

Member 14152690

У меня просто появилась идея, которая может мне помочь. Но нужна помощь для возвращения.

Общественного Класса Form1
Dim a As Integer = engine(100, a.GetType, p)
Дим P в качестве указателя IntPtr = новый тип IntPtr(а)

Частная суб Form1_Click(отправителя как объект, как система.EventArgs) Обрабатывает Меня.Click
Отлаживать.Print("первый проход")
Отлаживать.Напечатать("а:" &амп; с)
Отлаживать.Печати("б:" &амп; С. Метод toString)
a = двигатель(50, a.GetType, p)
Отлаживать.Печать("второй проход")
Отлаживать.Напечатать("а:" &амп; с)
Отлаживать.Печати("б:" &амп; С. Метод toString)
Конец Подводной Лодки
Частная двигателя функция(бывал вывода Как объект, как byval T как тип, бывал P в качестве указателя IntPtr)
p = ctype(o, t)
Возвращение о'
Конечная Функция
End Класса

Я думаю, что это сработает, и у меня была переменная нетронутой, но я не знаю, как ее вернуть. Это дает мне ошибку в ctype. Может быть, нужны какие-то изменения

Maciej Los

Пожалуйста, прочтите мой предыдущий комментарий и перейдите по этой ссылке: Расслабленное Преобразование Делегатов (Visual Basic) | Microsoft Docs[^]

Member 14152690

Извините, я не читал предыдущий пост. Спасибо

Maciej Los

Не беспокойся. Взгляните на время публикации ;)