Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не пойму очередности получаемых событий 
:(
    Опции темы
Compositum
Дата 12.9.2009, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: 1
Всего: 1



Как говорится, лучше 1 раз увидеть, чем 100 раз услышать. Создаю пару классов, в которых реализую свойство зависимостей и хочу посмотреть путь инициализации объектов. То, что увидел - меня несколько озадачило. Итак исходные данные
Создал два класса.
1-й класс:
Код

using System;
using System.Windows;
using System.Windows.Controls;

namespace Compositum.Laboratories.AnalysisDependencyProperty
{
    /// <summary>
    /// Данный класс делаю производным от ContentControl, чтобы пока не заморачиваться
    /// с реализацией наследования...
    /// </summary>
    class FirstClass : ContentControl
    {        
        public FirstClass(string name)
        {
            Name = name;
            Console.WriteLine("Создаётся экземпляр класса {0}. Экземпляру присвоено имя {1}",
                this.GetType().Name, Name);
        }
        public static readonly DependencyProperty MyIntProperty;
        /// <summary>
        /// Собственно свойство, посредством которого получаю доступ....
        /// </summary>
        public int MyInt
        {
            get { return (int)GetValue(MyIntProperty); }
            set { SetValue(MyIntProperty, value); }
        }
        static FirstClass()
        {
            FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();
            metadata.DefaultValue = 7;
            metadata.Inherits = true;
            metadata.PropertyChangedCallback += MyIntValueChenged;
            MyIntProperty = DependencyProperty.Register("MyIntProperty", typeof(int), typeof(FirstClass), 
                metadata, CheckMyIntValue);
        }
        static bool CheckMyIntValue(object value)
        {
            Console.WriteLine("Результат проверки присваиваемого значения свойства MyInt класса FirstClass:");
            if ((int)value >= 0)
            {               
                Console.WriteLine("Присваиваемое значение соответствует требованиям."); return true; }
            else { Console.WriteLine("Присваиваемое значение Н0Е соответствует требованиям!"); return false; }
        }
        static void MyIntValueChenged(object sender, DependencyPropertyChangedEventArgs args)
        {
            Console.WriteLine("Происходит изменение значения {2}, пренадлежащего классу {3}: \nПрежнее значение: {0}\nНовое значение: {1}",
                args.OldValue, args.NewValue, args.Property.Name, args.Property.OwnerType);            
        }
    }
}

2-й класс:
Код

using System;
using System.Windows;
using System.Windows.Controls;

namespace Compositum.Laboratories.AnalysisDependencyProperty
{
    /// <summary>
    /// Данный класс делаю производным от ContentControl, чтобы пока не заморачиваться
    /// с реализацией наследования...
    /// </summary>
    class SecondClass : ContentControl
    {
        public SecondClass(string name)
        {
            Name = name;
            Console.WriteLine("Создаётся экземпляр класса {0}. Экземпляру присвоено имя {1}",
                this.GetType().Name, Name);
        }

        public static readonly DependencyProperty MyIntProperty;
        public int MyInt
        {
            get { return (int)GetValue(MyIntProperty); }
            set { SetValue(MyIntProperty, value); }
        }
        static SecondClass()
        {
            FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();
            metadata.DefaultValue = 77;
            metadata.Inherits = true;
            metadata.PropertyChangedCallback += MyPropertyChenged;
            MyIntProperty = FirstClass.MyIntProperty.AddOwner(typeof(SecondClass));
            MyIntProperty.OverrideMetadata(typeof(SecondClass), metadata);
        }
        static void MyPropertyChenged(object sender, DependencyPropertyChangedEventArgs args)
        {
            Console.WriteLine("Происходит изменение значения {2}, пренадлежащего классу {3}: \nПрежнее значение: {0}\nНовое значение: {1}",
                args.OldValue, args.NewValue, args.Property.Name, args.Property.OwnerType);
        }
    }
}

Создаю точку входа:
Код

using System;
using System.Windows;
using System.Windows.Controls;
using Compositum.Laboratories.CommonClasses;
using System.Reflection;
using System.IO;
using System.Collections;
using System.Windows.Media;

namespace Compositum.Laboratories.AnalysisDependencyProperty
{
    class Program
    {
        [STAThread]
        static void Main()
        {
            FirstClass fClass1 = new FirstClass("fClass1");
            FirstClass fClass2 = new FirstClass("fClass2");
            Console.WriteLine(new string('=', 30));
            fClass1.Content = fClass2;
            fClass1.MyInt = 8;
            Console.Read();  
        }
    }
}

Памятуя, что статический конструктор запускается раньше конструктора создания экземпляра (если мне не изменяет память) я ожидал увидеть в окне консоли следующий результат:
Цитата

Результат проверки присваиваемого значения свойства MyInt класса FirstClass:
Присваиваемое значение соответствует требованиям.
Создаётся экземпляр класса FirstClass. Экземпляру присвоено имя fClass1
Результат проверки присваиваемого значения свойства MyInt класса FirstClass:
Присваиваемое значение соответствует требованиям.
Создаётся экземпляр класса FirstClass. Экземпляру присвоено имя fClass2
==============================
Результат проверки присваиваемого значения свойства MyInt класса FirstClass:
Присваиваемое значение соответствует требованиям.
Происходит изменение значения MyIntProperty, пренадлежащего классу Compositum.La
boratories.AnalysisDependencyProperty.FirstClass:
Прежнее значение: 7
Новое значение: 8
Результат проверки присваиваемого значения свойства MyInt класса FirstClass:
Присваиваемое значение соответствует требованиям.
Происходит изменение значения MyIntProperty, пренадлежащего классу Compositum.La
boratories.AnalysisDependencyProperty.FirstClass:
Прежнее значение: 7
Новое значение: 8

Однако по факту получаю это:
Цитата

Результат проверки присваиваемого значения свойства MyInt класса FirstClass:
Присваиваемое значение соответствует требованиям.
Результат проверки присваиваемого значения свойства MyInt класса FirstClass:
Присваиваемое значение соответствует требованиям.
Создаётся экземпляр класса FirstClass. Экземпляру присвоено имя fClass1
Создаётся экземпляр класса FirstClass. Экземпляру присвоено имя fClass2
==============================
Результат проверки присваиваемого значения свойства MyInt класса FirstClass:
Присваиваемое значение соответствует требованиям.
Происходит изменение значения MyIntProperty, пренадлежащего классу Compositum.La
boratories.AnalysisDependencyProperty.FirstClass:
Прежнее значение: 7
Новое значение: 8
Происходит изменение значения MyIntProperty, пренадлежащего классу Compositum.La
boratories.AnalysisDependencyProperty.FirstClass:
Прежнее значение: 7
Новое значение: 8

Как видим, моё видение предполагаемого развития событий ни в какие ворота не лезут по сравнению с реальным положением дел...
Кто может объяснить получаемый результат, где моя ошибка?
PM   Вверх
RomanEEP
Дата 18.9.2009, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: нет
Всего: 8



Статический конструктор вызывается первым и только один раз!
PM MAIL   Вверх
math64
Дата 21.9.2009, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Дело не в этом. Свойство объявлено с metadata.Inherits = true;
При наследовании свойчтва его значение повторно не проверяется, но сообщение о его изменении выдаётся.
Но почему при создании объектов сначала выдается сообщение о проверке значений обоих объектов, а затем сообщения о создании объектов?
Или первое сообщение выдаёт статический конструктор, а затем обычный (при вызове конструктора базового класса!)? Но тогда почему обычный конструктор выдаёт его во второй раз?

PM   Вверх
RomanEEP
Дата 21.9.2009, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: нет
Всего: 8



Потому проверка значений выполняется 2 раза при вызове статического конструктора. Закоментарь создание одного из объектов и все равно проврка будет идти дважды
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0427 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.