1 | ||||||
.NET 4.x Изменение значения readonly09.01.2017, 00:26. Показов 2950. Ответов 21
Метки нет (Все метки)
Работаю с WPF, но не пойму куда точно это отнести. Поэтому пока сюда.
Итак:
CountByHand изменяется поле realCountByHand .- Почему? - Можно ли как то сделать неизменяемое поле, значение которого будет задаваться в конструкторе и состоящее из операций (у меня умножение) других полей в других классах-параметрах?
0
|
09.01.2017, 00:26 | |
Ответы с готовыми решениями:
21
Изменение свойства ReadOnly у DataGridViewRow, являющейся новой добавленной строкой в DataGridView Изменение свойства readonly Изменение свойства ReadOnly редактора Edit Изменение значения в таблице при изменение в ячейке DBGridEh |
140 / 137 / 22
Регистрация: 16.02.2012
Сообщений: 453
|
|
09.01.2017, 02:56 | 2 |
1) Не знаю почему, не вижу чтобы это поле изменялось.
2) Разве так и не сделано?
0
|
09.01.2017, 11:25 [ТС] | 3 |
1) Эмм..видео дебага прям вот обязательно? Сделаю.
2) Ну раз запостил, то нет же. Добавлено через 2 часа 36 минут И опять же, readonly поле можно только с помощью рефлексии поменять? Если да - то такое у меня в проекте вообще не используется.
0
|
140 / 137 / 22
Регистрация: 16.02.2012
Сообщений: 453
|
|
09.01.2017, 11:28 | 4 |
Знаешь такую штуку MSDN называется?
0
|
140 / 137 / 22
Регистрация: 16.02.2012
Сообщений: 453
|
|
09.01.2017, 11:43 | 6 |
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
09.01.2017, 12:39 | 7 |
Сообщение было отмечено skilllab как решение
Решение
Это невозможно, такой код просто не скомпилируется.
Если, конечно, вы не используете трюки с рефлексией или небезопасным кодом. Может, вы в сеттере просто меняете локальную переменную с таким же именем? Может, вы где-то создаете новый экземпляр MaterialRow с другим значением? Много чего может быть, но вот readonly-поле в том же экземпляре за пределами конструктора/инициализатора вы не измените без использования рефлексии или небезопасного кода.
1
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
||||||
09.01.2017, 13:03 | 9 | |||||
skilllab, пока видео не записали, может поделитесь — как вы определяете, что значение изменилось? В отладчике видите другое значение или разные ветки кода в сеттере выполняются?
Если в отладчике, то в списке просматриваемых переменных добавьте и такое поле:
0
|
09.01.2017, 13:27 [ТС] | 10 |
kolorotur, в отладчике вижу. И выполняется If тоже с как бы изменённым значением.
Именно в одном. Он же завязан на отображение в таблице (View), так что я вижу и знаю что класс существует в единственном экземпляре. Про хэш - спасибо. Добавлю. Добавлено через 3 минуты Так так и есть. readonly поле инициализируется в конструкторе класса с помощью CountByHandKIT и некоего числа. Потом я этот CountByHandKIT меняю. Но почему readonly поле то меняется?Получается, что как бы в памяти висит не значение поля, а ссылка, если поле создано из свойств класса?
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
09.01.2017, 13:27 | 11 |
Там условие странное: если присвоить свойству false, то выполнится одна ветка, если true, то другая. Даже если значение поля одно и то же.
Проверьте значение value в сеттере, особенно если вы это свойство привязываете — WPF может послать в сеттер весьма неожиданное значение. Ну может где-то неявным образом создается второй экземпляр. Лучше быть уверенным. Добавлено через 33 секунды Не понял вот этот момент. Можете код показать?
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
09.01.2017, 13:33 | 13 |
Ну весь и не нужно
Просто покажите строчки, где значение изменяется. Заодно можете правокликнуть по полю, жамкнуть Find all references и посмотреть, присваивается ли этой переменной значение где-либо за пределами конструктора.
0
|
09.01.2017, 14:00 [ТС] | 14 | |||||||||||
Класс - del
Класс окна - там меняю значение, del только вечером. Сейчас нет кода и студии. Выше код выдернул с битбакета Добавлено через 1 минуту Это значение private. Нигде кроме конструктора этого поля нет. Рефлексии во всём проекте тоже нет (я бы запомнил такое ). Добавлено через 3 минуты Вот тут непонятно: второй экземпляр, т.е. дублирующий, т.е. ссылающийся на одно и то же место в памяти? Классов таких несколько (таблица же). Значение изменяю именно в том, в котором надо. Ибо в других realCountByHand вообще имеет другое значение. Я б такое точно не пропустил))Добавлено через 9 минут так из за этого то и беда. Создаю класс, инициализирую поле readonly (к примеру
Далее из таблицы (View), меняю свойство класса (коллекция из классов RefMaterialRow отображается на строки) RefMaterialRow (к примеру CountByHand = 20). Дебагом захожу в setter класса - всё хорошо. Поле readonly имеет значение, которое было установлено при инициализации (10).Далее снова из View меняю значение, захожу в setter и вижу, что поле которое readonly вдруг стало тем самым старым значением CountByHand (т.е. 20) Добавлено через 5 минут Никакого пересоздания класса с новым значением не происходит. Строку //context.UpdateTable(); в классе закомитил. Она как раз пересоздавала всю таблицу. Сейчас всё на привязках и NotifyChanged
0
|
140 / 137 / 22
Регистрация: 16.02.2012
Сообщений: 453
|
|
09.01.2017, 14:02 | 15 |
По коду нет никаких изменений realCountByHand, кроме как в конструкторе. И как же оно может изменяться при изменении CountByHand? Ищите у себя ошибку.
0
|
09.01.2017, 14:04 [ТС] | 16 |
Повторяю - для этого данный форум и существует. Для помощи, поиска и исправления своих ошибок. Вашу помощь в виде MSDN я уже принял, неспасибо
Теперь попробую от других участников.
0
|
140 / 137 / 22
Регистрация: 16.02.2012
Сообщений: 453
|
|
09.01.2017, 14:12 | 17 |
Есть еще вариант - смотрел на CountByHand, а думал на переменную. Но вероятнее всего действительно создаётся новый инстанс, что автор попросту просмотрел.
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
09.01.2017, 14:29 | 18 |
skilllab, создайте коллекцию ровно из одного экземпляра RefMaterialRow, чтобы в гриде была одна строчка. Попробуйте воспроизвести баг.
Ну и не путайте свойство CountByHand и поле realCountByHand
0
|
09.01.2017, 17:43 [ТС] | 19 |
kolorotur, угу.
Добавлено через 31 секунду и с этим тоже сделаю Добавлено через 53 минуты Класс - RefMaterialRow Класс окна - SpecificationTableView угу, запамятовал. Добавлено через 2 часа 19 минут Блин. Да. В других дебрях при переприсваивании свойств действительно был код обновления всей ViewModel (а это значит пересоздание таблицы). Когда-то использовался для обновления глубоко зарытых данных в свойствах айтемов коллекции. До поры до времени не мешал, на производительности не сказывался. Код не рефакторился пока. Ну, буду знать))
0
|
140 / 137 / 22
Регистрация: 16.02.2012
Сообщений: 453
|
|
09.01.2017, 18:03 | 20 |
Короче чуда не произошло.
0
|
09.01.2017, 18:03 | |
09.01.2017, 18:03 | |
Помогаю со студенческими работами здесь
20
Добавление кнопки "Обзор" // Изменение свойств поля,изменение значения по 2му шелчку Изменение значения SV Изменение значения в БД Изменение значения 7 Интерфейсы и Readonly @property (readonly) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |