Форум программистов, компьютерный форум, киберфорум
Visual Studio, VS Code
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
1 / 1 / 0
Регистрация: 14.11.2020
Сообщений: 13
VS 2019

Странно работает отладчик при выполнении команд свойства класса

14.11.2020, 19:40. Показов 2480. Ответов 4

Студворк — интернет-сервис помощи студентам
Добрый вечер, у меня как то странно себя ведет отладчик при работе со свойством класса. У меня есть класс Fibs, с статическим свойством number, в нем есть гет и сет аксессоры. При считывании значения свойства, по умолчанию будут выводиться числа фибоначчи начиная с 1. Если вывести значение свойства после присваивании числа, допустим 6, выведется шестое число по счету в ряду фибоначчи, это 8. Чтоб лучше понять и запомнить код, я решил пошагово посмотреть выполнение программы, но результат стал отличаться. Чтоб отладчик заходил в свойства класса я убрал флажок "Обход свойств и операторов(только управляемый код)". Также я отключил JIT-оптимизацию при загрузке модуля. Отладчик как будто опережает выполнение программы, команда на строке 143 еще не выполнена, а отладчик уже присвоил переменной last число 2. А теперь last уже 3, хотя в этом блоке только один раз изменяется переменная last. Причем без отладчика, ответ верный выдает и если не отключать галочку обход свойств и операторов, но тогда нельзя посмотреть, что происходит в блоке свойства. Не знал где лучше задать вопрос в разделе по си шарпу или тут. Буду благодарен, если кто-нибудь поможет неопытному дурачку, как я
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class Fibs
{
    private static int last = 1;
    private static int prev = 1;
    public static int number
    {
        get
        {
            int res = prev;
            last +=  prev;
            prev = last - prev;
            return res;
        }
        set
        {
            prev = 1;
            last = 1;
            for (int i = 2; i <= value; i++)
            {
                last = last + prev;
                prev = last - prev;
            }
        }
    }
}
class Programm
{
    static void Main()
    {
        for (int i = 1; i <= 10; i++)
            Console.Write("{0, 4}", Fibs.number);
        Console.WriteLine();
        Fibs.number = 6;
        for (int i = 1; i <= 10; i++)
            Console.Write("{0, 4}", Fibs.number);
        Console.WriteLine();
        Fibs.number = 1;
        for (int i = 1; i <= 10; i++)
            Console.Write("{0, 4}", Fibs.number);
        Console.WriteLine();
        Console.ReadKey();
    }
}
Миниатюры
Странно работает отладчик при выполнении команд свойства класса   Странно работает отладчик при выполнении команд свойства класса   Странно работает отладчик при выполнении команд свойства класса  

Странно работает отладчик при выполнении команд свойства класса  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.11.2020, 19:40
Ответы с готовыми решениями:

При выполнении батника на некоторых машинах с Windows XP не работает перенаправление вывода команд в NUL
не работает перенаправление &gt;nul проблема возникает на некоторых машинах под управлением рус winXP @echo off :LOOP ::...

Отладчик не подсвечивает строку кода с ошибкой при выполнении
помогите, пожалуйста.У меня выходит окошко типа невозможно преобразовать тип string в int32.Но дело даже не в этом.Я не могу увидеть где в...

Является ли Binding команд на свойства статического класса нарушением MVVM?
Есть класс FileDropper в котом есть команды: public static class FileDropper { #region Properties public static ICommand...

4
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18244 / 14158 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
14.11.2020, 20:22
Ruth, чтобы показать значение свойства отладчику нужно его прочитать, что означает необходимость выполнить код get-ра, который меняет состояние объекта. Отсюда и "странное" поведение отладчика, которое, конечно, никакое не странное, а полностью логичное в соответствии с вашим кодом.

Следует переписать код так чтобы get-ры свойств не меняли состояние объекта. Так лучше не делать т.к. это ведет к ошибкам.
1
1 / 1 / 0
Регистрация: 14.11.2020
Сообщений: 13
14.11.2020, 20:43  [ТС]
Честно говоря, сначала на импульсе подумал, что понял, а потом понял, что не понял. Объясните пожалуйста, разве по блоку команд get-ра отладчик не один раз проходит? На 31 строке я запрашиваю значение свойства, отладчик переходит на 9 строку, все правильно, но на скриншотах, которые я прикрепил видно, что изменения переменных происходит до выполнения команды, а как бы заранее. И переменная last изменяется два раза, а должна всего один раз. И почему результат с отладчиком и без отладчика разный? Программа же выполняется одинаково в любом случае, а отладчик просто показывает пошаговое выполнение. Спасибо за ответ
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18244 / 14158 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
14.11.2020, 22:01
Лучший ответ Сообщение было отмечено Ruth как решение

Решение

Ruth, задайтесь простым вопросом - как отладчик узнает значение свойства? Ответ - он читает его т.е. вызывает getter. Значит когда вы идете пошагово по коду внутри get, отлачик каждый раз вызывает getter чтобы узнать текущее значение свойства. И т.к. ваш код меняет static поля, то значение свойства "внезапно" меняется вместе с с полями. И происходит это потому что вы неправильно написали свойство number.

1) Блок get не должен менять состояние объекта. Ваш код меняет.
2) get и set должны работать согласовано. Если свойству присваивается значение и затем сразу читается, то это должно быть одно и то же значение. У вас это разное.
3) Чтение свойства несколько раз подряд должно давать одинаковый результат. У вас это не соблюдается.

Нужно переписать код например так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Fibs
{
    private static int last = 1;
    private static int prev = 0;
    
    public static int Current
    {
        get
        {
            return last + prev;
        }
    }
    
    public static int GetNext()
    {
        int res = prev;
        last += prev;
        prev = last - prev;
        return res;
    }
    
    public static void SetNearestNext(int next)
    {
        // TODO
    }
}
0
1 / 1 / 0
Регистрация: 14.11.2020
Сообщений: 13
14.11.2020, 22:30  [ТС]
Спасибо! Вагон чая вам
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.11.2020, 22:30
Помогаю со студенческими работами здесь

Множество ошибок при выполнении команд
Вот батник: set JORUNAL_DIR = C:\Program Files\Avers\Journal set DIRECTOR_DIR = C:\Program Files\Avers\ДИРЕКТОР cd...

SQLte ошибка при выполнении команд: Database file is locked
Когда я говорю SQLite выполнить мою команду: Public Function testik() Dim myConnection As New...

Доступ к GUI из другого класса. Работает странно
Приветствую. Есть графический интерфейс, с формой page.ui. На ней есть например виджет Label. в page.h добавил public slots: ...

Приложение работает в Debug, странно работает в Release и не работает при билде
Действия выполняются на эмуляторе Pixel 2. Android 9.0. Если я запускаю приложение с конфигурацией Debug, то всё в порядке. При запуске же...

Вызов другого класса при создании свойства класса
Здравствуйте! Пишу внутри класса, но не в методе: public $ln = DB::getLang(); DB - это другой класс, getLang() - метод в нём. То есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru