Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,993
Записей в блоге: 1
1
.NET 4.x

Изменение значения readonly

09.01.2017, 00:26. Показов 2950. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Работаю с WPF, но не пойму куда точно это отнести. Поэтому пока сюда.
Итак:
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
public class MaterialRow : INotifyPropertyChanged
{ 
    private readonly double realCountByHand;
 
   public double CountByHand
   {
       get
       {
           return ((MaterialSpecification)Item).CountByHandKIT;
       }       
       set
       {
          ((MaterialSpecification)Item).CountByHandKIT = value;
          
          if (realCountByHand != value)
          {
              //Действия
          }
          else
          {
              //Действия
          }
       }
   }
 
   public MaterialRow (MaterialSpecification materialItem, double realCountFromKit = 1)
   {
      realCountByHand = materialItem.CountByHandKIT*realCountFromKit;
   }
}
При изменении CountByHand изменяется поле realCountByHand.
- Почему?
- Можно ли как то сделать неизменяемое поле, значение которого будет задаваться в конструкторе и состоящее из операций (у меня умножение) других полей в других классах-параметрах?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2017, 00:26
Ответы с готовыми решениями:

Изменение свойства ReadOnly у DataGridViewRow, являющейся новой добавленной строкой в DataGridView
Здарова всем. Подскажите пожалуйста, как сделать так, чтобы при загрузки формы, строки...

Изменение свойства readonly
Здравствуйте. У меня есть форма и поле textarea с установленным readonly Мне нужно, чтобы при...

Изменение свойства ReadOnly редактора Edit
Я хочу, чтобы при выборе одного значения из RadioBox свойству ReadOnly редактора Edit присваивалось...

Изменение значения в таблице при изменение в ячейке DBGridEh
Имею на форме DBGridEh, DataSet, ADOTable в таблице есть поля boolean. Не могу понять как при...

21
140 / 137 / 22
Регистрация: 16.02.2012
Сообщений: 453
09.01.2017, 02:56 2
1) Не знаю почему, не вижу чтобы это поле изменялось.
2) Разве так и не сделано?
0
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,993
Записей в блоге: 1
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
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,993
Записей в блоге: 1
09.01.2017, 11:29  [ТС] 5
Где-то слышал. Она как замена форуму вроде идёт, да?
0
140 / 137 / 22
Регистрация: 16.02.2012
Сообщений: 453
09.01.2017, 11:43 6
Цитата Сообщение от skilllab Посмотреть сообщение
Она как замена форуму вроде идёт, да?
Сначала MSDN, потом форум. Не перепутай!
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
09.01.2017, 12:39 7
Лучший ответ Сообщение было отмечено skilllab как решение

Решение

Цитата Сообщение от skilllab Посмотреть сообщение
При изменении CountByHand изменяется поле realCountByHand.
Это невозможно, такой код просто не скомпилируется.
Если, конечно, вы не используете трюки с рефлексией или небезопасным кодом.

Может, вы в сеттере просто меняете локальную переменную с таким же именем?
Может, вы где-то создаете новый экземпляр MaterialRow с другим значением?

Много чего может быть, но вот readonly-поле в том же экземпляре за пределами конструктора/инициализатора вы не измените без использования рефлексии или небезопасного кода.
1
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,993
Записей в блоге: 1
09.01.2017, 12:51  [ТС] 8
kolorotur, так и я о том же. Сегодня видео запишу.
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
09.01.2017, 13:03 9
skilllab, пока видео не записали, может поделитесь — как вы определяете, что значение изменилось? В отладчике видите другое значение или разные ветки кода в сеттере выполняются?
Если в отладчике, то в списке просматриваемых переменных добавьте и такое поле:
C#
1
this.GetHashCode()
, чтобы убедиться, что разные значения поля проверяются в одном и том же экземпляре.
0
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,993
Записей в блоге: 1
09.01.2017, 13:27  [ТС] 10
kolorotur, в отладчике вижу. И выполняется If тоже с как бы изменённым значением.
Цитата Сообщение от kolorotur Посмотреть сообщение
разные значения поля проверяются в одном и том же экземпляре
Именно в одном. Он же завязан на отображение в таблице (View), так что я вижу и знаю что класс существует в единственном экземпляре.
Про хэш - спасибо. Добавлю.

Добавлено через 3 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
Может, вы в сеттере просто меняете локальную переменную с таким же именем?
Так так и есть. readonly поле инициализируется в конструкторе класса с помощью CountByHandKIT и некоего числа. Потом я этот CountByHandKIT меняю. Но почему readonly поле то меняется?
Получается, что как бы в памяти висит не значение поля, а ссылка, если поле создано из свойств класса?
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
09.01.2017, 13:27 11
Цитата Сообщение от skilllab Посмотреть сообщение
выполняется If тоже с как бы изменённым значением.
Там условие странное: если присвоить свойству false, то выполнится одна ветка, если true, то другая. Даже если значение поля одно и то же.
Проверьте значение value в сеттере, особенно если вы это свойство привязываете — WPF может послать в сеттер весьма неожиданное значение.

Цитата Сообщение от skilllab Посмотреть сообщение
Именно в одном. Он же завязан на отображение в таблице (View)
Ну может где-то неявным образом создается второй экземпляр.
Лучше быть уверенным.

Добавлено через 33 секунды
Цитата Сообщение от skilllab Посмотреть сообщение
Так так и есть. readonly поле инициализируется в конструкторе класса с помощью CountByHandKIT и некоего числа. Потом я этот CountByHandKIT меняю. Но почему readonly поле то меняется?
Получается, что как бы в памяти висит не значение поля, а ссылка, если поле создано из свойств класса?
Не понял вот этот момент.
Можете код показать?
0
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,993
Записей в блоге: 1
09.01.2017, 13:30  [ТС] 12
Цитата Сообщение от kolorotur Посмотреть сообщение
Можете код показать?
Весь нет (это почти corporate но для маленькой фирмы да и много там всего нужно сделать, чтобы воспроизвести - проще видео записать). Класс сам могу.
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
09.01.2017, 13:33 13
Цитата Сообщение от skilllab Посмотреть сообщение
Весь нет
Ну весь и не нужно
Просто покажите строчки, где значение изменяется.

Заодно можете правокликнуть по полю, жамкнуть Find all references и посмотреть, присваивается ли этой переменной значение где-либо за пределами конструктора.
0
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,993
Записей в блоге: 1
09.01.2017, 14:00  [ТС] 14
Класс - del
Класс окна - там меняю значение, del
Цитата Сообщение от kolorotur Посмотреть сообщение
Find all references
только вечером. Сейчас нет кода и студии. Выше код выдернул с битбакета

Добавлено через 1 минуту
Цитата Сообщение от kolorotur Посмотреть сообщение
присваивается ли этой переменной значение где-либо за пределами конструктора
Это значение private. Нигде кроме конструктора этого поля нет. Рефлексии во всём проекте тоже нет (я бы запомнил такое ).

Добавлено через 3 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
Ну может где-то неявным образом создается второй экземпляр.
Вот тут непонятно: второй экземпляр, т.е. дублирующий, т.е. ссылающийся на одно и то же место в памяти?

Классов таких несколько (таблица же). Значение изменяю именно в том, в котором надо. Ибо в других realCountByHand вообще имеет другое значение. Я б такое точно не пропустил))

Добавлено через 9 минут
Цитата Сообщение от kolorotur Посмотреть сообщение
значение value в сеттере
так из за этого то и беда.
Создаю класс, инициализирую поле readonly (к примеру
C#
1
realCountByHand = materialItem.CountByHandKIT/*10*/*realCountFromKit/*1*/;
). Всё хорошо, всё отображается на View.
Далее из таблицы (View), меняю свойство класса (коллекция из классов RefMaterialRow отображается на строки) RefMaterialRow (к примеру CountByHand = 20). Дебагом захожу в setter класса - всё хорошо. Поле readonly имеет значение, которое было установлено при инициализации (10).
Далее снова из View меняю значение, захожу в setter и вижу, что поле которое readonly вдруг стало тем самым старым значением CountByHand (т.е. 20)

Добавлено через 5 минут
Никакого пересоздания класса с новым значением не происходит. Строку //context.UpdateTable(); в классе закомитил. Она как раз пересоздавала всю таблицу. Сейчас всё на привязках и NotifyChanged
 Комментарий модератора 
Файлы загружайте на форум
Вложения
Тип файла: rar Классы.rar (2.8 Кб, 4 просмотров)
0
140 / 137 / 22
Регистрация: 16.02.2012
Сообщений: 453
09.01.2017, 14:02 15
По коду нет никаких изменений realCountByHand, кроме как в конструкторе. И как же оно может изменяться при изменении CountByHand? Ищите у себя ошибку.
0
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,993
Записей в блоге: 1
09.01.2017, 14:04  [ТС] 16
Цитата Сообщение от SharpDeveloper Посмотреть сообщение
И как же оно может изменяться при изменении CountByHand?
Повторяю - для этого данный форум и существует. Для помощи, поиска и исправления своих ошибок. Вашу помощь в виде MSDN я уже принял, неспасибо
Теперь попробую от других участников.
0
140 / 137 / 22
Регистрация: 16.02.2012
Сообщений: 453
09.01.2017, 14:12 17
Есть еще вариант - смотрел на CountByHand, а думал на переменную. Но вероятнее всего действительно создаётся новый инстанс, что автор попросту просмотрел.
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
09.01.2017, 14:29 18
skilllab, создайте коллекцию ровно из одного экземпляра RefMaterialRow, чтобы в гриде была одна строчка. Попробуйте воспроизвести баг.
Ну и не путайте свойство CountByHand и поле realCountByHand
0
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,993
Записей в блоге: 1
09.01.2017, 17:43  [ТС] 19
kolorotur, угу.

Добавлено через 31 секунду
и с этим тоже сделаю
Цитата Сообщение от kolorotur Посмотреть сообщение
this.GetHashCode()
Добавлено через 53 минуты
Цитата Сообщение от skilllab Посмотреть сообщение
Класс - del
Класс окна - там меняю значение, del
Класс - RefMaterialRow
Класс окна - SpecificationTableView
Цитата Сообщение от skilllab Посмотреть сообщение
Файлы загружайте на форум
угу, запамятовал.

Добавлено через 2 часа 19 минут
Блин. Да.
В других дебрях при переприсваивании свойств действительно был код обновления всей ViewModel (а это значит пересоздание таблицы). Когда-то использовался для обновления глубоко зарытых данных в свойствах айтемов коллекции. До поры до времени не мешал, на производительности не сказывался. Код не рефакторился пока. Ну, буду знать))
0
140 / 137 / 22
Регистрация: 16.02.2012
Сообщений: 453
09.01.2017, 18:03 20
Короче чуда не произошло.
0
09.01.2017, 18:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.01.2017, 18:03
Помогаю со студенческими работами здесь

Добавление кнопки "Обзор" // Изменение свойств поля,изменение значения по 2му шелчку
Доброго времени суток! Есть форма для будущего заполнения пустой базы данных для учета...

Изменение значения SV
Нужно написать алгоритм для изменение значения SV. При этом SV меняется 0-100 (%). Если значении...

Изменение значения в БД
пишу запрос на изменение значения в столбце ISN_INVENTORY таблицы ISN_REQUIRED_WORK...

Изменение значения 7
Добрый день! Стоит задача переопределить значение 7. Только не надо кричать, что это бред. Мне...

Интерфейсы и Readonly
Я знакомлюсь с интерфейсами и у меня возник вопрос. Можно ли в интерфейс добавить члены с...

@property (readonly)
Добрый вечер, Решил немного поизучать obj-c. Пока не очень привычно Вопрос такой: мутаторы...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru