Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 538

Не вызывается setter неявно

12.09.2014, 12:43. Показов 1640. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не знаю как правильно это называется, вот код:
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
 
namespace ConsoleApplication1
{
    #region Simple
    class Simple : INotifyPropertyChanged
    {
        #region Fields
        private double s;
        #endregion
 
        #region Events
        public event PropertyChangedEventHandler PropertyChanged;
        #endregion
 
        #region Methods
        protected void NotifyPropertyChanged(string propertyName = "")
        {
            if (null != PropertyChanged)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
 
        public double S
        {
            get
            {
                return s;
            }
            set
            {
                s = value;
                NotifyPropertyChanged();
            }
        }
        #endregion
    }
    #endregion
 
    #region Program
    class Program
    {
        #region Methods
        static void Main(string[] args)
        {
            Simple s1 = new Simple();
            Simple s2 = new Simple();
            s1.S = 10;
            s2 = s1;<---------------------------------------------------------Красная строчка
        }
 
        public void SetContent(Simple value)<-------------------------------------Синяя строчка
        {
            S = value.S;
        }
        #endregion
    }
    #endregion
}
Почему в красной строчке не вызывается S.set? Как сделать так, чтобы при операторе = вызывались settter'ы соответствующих свойств? Нужно вот для чего: у меня есть UserControl и в нем есть некоторые виджеты, которые прибиндены к соответствующему свойству в структуре Simple. И когда я пишу "s2 = s1;" я хочу чтобы контент этих виджетов обновился. Можно написать функцию, которая явно зовет "S", она выделена синим, но так я делать категорически не хочу, потому что когда я добавлю какой-либо виджет в UserControl и соответствующее ему свойство в Simple, я просто могу забыть что мне нужно еще и дописать "S = value.S;" в SetContent.
Может я принципиально делаю что-то не так?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.09.2014, 12:43
Ответы с готовыми решениями:

В каких случаях неявно вызывается objectName.ToString()?
В каких случаях неявно вызывается objectName.ToString()?

NULL в таблице, Setter не вызывается (Doctrine)
Item.orm.yml: AppBundle\Entity\Item: type: entity manyToMany: categories: targetEntity:...

Окно настройки принтера не вызывается через меню, но вызывается по кнопке
Доброго времени суток. Помогите разобраться. Подключаю к программе принтер, начал с вывода окна настроек принтера. Не могу понять, создал в...

9
Native x86
Эксперт Hardware
 Аватар для quwy
6858 / 3791 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
12.09.2014, 12:56
Вы перезаписываете переменную, в которой лежал один экземпляр класса, другим экземпляром. При этом содержимое s2 просто теряется. Экземпляр класса Simple, который лежал в s2, передается сборщику мусора и больше недоступен, а в s2 лежит ссылка на тот же экземпляр, который был в s1.
1
106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 538
12.09.2014, 13:07  [ТС]
Цитата Сообщение от quwy Посмотреть сообщение
Вы перезаписываете переменную, в которой лежал один экземпляр класса, другим экземпляром. При этом содержимое s2 просто теряется. Экземпляр класса Simple, который лежал в s2, передается сборщику мусора и больше недоступен, а в s2 лежит ссылка на тот же экземпляр, который был в s1.
М, ясно. Как избавиться от функции SetContent? То есть как сделать так, чтобы при вызове оператора= (или как это называется в c#) вызывались именно сеттеры соответствующих свойств (S.set для s и остальные если есть) ?
0
Native x86
Эксперт Hardware
 Аватар для quwy
6858 / 3791 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
12.09.2014, 13:10
Цитата Сообщение от Kukurudza Посмотреть сообщение
То есть как сделать так, чтобы при вызове оператора= (или как это называется в c#) вызывались именно сеттеры соответствующих свойств
Например перегрузкой оператора присваивания.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
12.09.2014, 13:18
Kukurudza, посмотрите на такой класс:
C#
1
2
3
4
5
6
7
8
9
class Simple : INotifyPropertyChanged
    {
        #region Fields
        private double s;
        #endregion
 
        public double GetS(){return s;}
        public void SetS(double value){s=value;}
}
вот такой класс создается компилятором. То есть свойство - это именно два метода, хотя за синтаксисом этого не видно.
и запись вида s1.S=10; идентична записи s1.SetS(10);

вместо того, чтоб создавать метод SetContent следует написать конструктор копирования в классу Simple:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Simple
{
//конструктор копирования
     public Simple(Semple simple)
     {
           this.s=simple.S+10;//+10 для теста
     }
}
region Program
    class Program
    {
        #region Methods
        static void Main(string[] args)
        {
            Simple s1 = new Simple();
            s1.S = 10;
            Simple s2 = s1;
            Console.WriteLine("s1: {0} s2: {1}", s1.S, s2.S);
        }
        #endregion
    }
    #endregion
0
106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 538
12.09.2014, 13:25  [ТС]
quwy, я не хочу писать перегруженный оператор присваивания, потому что это один фиг что SetContent. Я так же могу забыть добавить присваивание какой-либо новой переменной.
Learx, тут дело не в конструировании объекта класса, а в том, что уже есть два объекта определенного класса и где то в коде я присваиваю один объект другому, происходит в точности то что сказал quwy, но я хочу чтобы вызывались setter'ы соответствующих свойств.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
12.09.2014, 13:48
а что мешает обращаться к свойству в конструкторе копирования?
C#
1
2
3
4
   public Simple(Semple simple)
     {
           this.S=simple.S+10;//+10 для теста
     }
и при этом не надо явно вызывать SetContent, при присваивании будет вызваться свойство.
0
106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 538
12.09.2014, 14:30  [ТС]
Мешает то что если я добавлю новое свойство, то в конструкторе я могу забыть его присвоить и компилятор мне об этом ничего не скажет
0
Native x86
Эксперт Hardware
 Аватар для quwy
6858 / 3791 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
12.09.2014, 15:13
Лучший ответ Сообщение было отмечено Kukurudza как решение

Решение

Цитата Сообщение от Kukurudza Посмотреть сообщение
Мешает то что если я добавлю новое свойство, то в конструкторе я могу забыть его присвоить и компилятор мне об этом ничего не скажет
Можно копировать динамически все имеющиеся свойства:
C#
1
2
3
4
5
6
7
static void CopyProperties(object dest, object src)
  {
   foreach (PropertyDescriptor item in TypeDescriptor.GetProperties(src))
   {
    item.SetValue(dest, item.GetValue(src));
   } 
  }
Добавлено через 1 минуту
Но тут нужно быть осторожным, если есть свойства, которые не являются простыми типами.
1
106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 538
12.09.2014, 15:21  [ТС]
О, вроде то что нужно.
Щас испробуем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.09.2014, 15:21
Помогаю со студенческими работами здесь

При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О
Вот такой кодclass A { public: A(){} virtual ~A(){} }; class C { public:

Setter value = another setter
Доброго времени! Имеется: &lt;Setter Property=&quot;SelectionBrush&quot; Value=&quot;{DynamicResource ApolloniaStyle.Foreground}&quot;/&gt; и &lt;Setter...

Setter и getter
Так и не понял смысл set и get в объектах js. Можно же использовать обычные методы ? В чем кардинальные отличия ? Добавлено через 48...

ArgumentNullException в Setter
Здравствуйте, public partial class ButtonImage : UserControl, INotifyPropertyChanged public static DependencyProperty...

Getter and setter
Не могу получить значения. Правильно ли я делаю? Здесь геттер и сеттер package mainPackage; public class Calculator { ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru